源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

一个基于Asp.Net MVC的权限方案

  • 时间:2021-10-23 12:00 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:一个基于Asp.Net MVC的权限方案
1.数据结构 [img]http://files.jb51.net/upload/2010-2/20100225092207291.png[/img] Mad_Popedom为权限表,Control记录控制器名,Action记录动作名。 Mad_Role为角色表。 2.权限控制的实现 此处使用比较简单AOP方式,用MVC的Filter实现,代码如下
[u]复制代码[/u] 代码如下:
using System.Collections.Generic; using System.Web.Mvc; using Madnet.Model.MadAdmin; using Madnet.BLL.MadAdmin; namespace Madnet.Controllers.MadAdmin { public class SupportFilterAttribute : ActionFilterAttribute { private bool _IsLogin = true; /// <summary> /// 是否需要登录 /// </summary> public bool IsLogin { set { _IsLogin = value; } get { if (System.Configuration.ConfigurationManager.AppSettings["IsLogin"] != null) { bool.TryParse(System.Configuration.ConfigurationManager.AppSettings["IsLogin"].ToString(), out _IsLogin); } return _IsLogin; } } public override void OnActionExecuting(ActionExecutingContext filterContext) { string controllerName = (string)filterContext.RouteData.Values["controller"]; string actionName = (string)filterContext.RouteData.Values["action"]; if (IsLogin && filterContext.HttpContext.Session["Login_User"] == null) { filterContext.HttpContext.Response.Redirect(new UrlHelper(filterContext.RequestContext).Action("Login", "Default")); filterContext.Result = new EmptyResult(); } else if (IsLogin && filterContext.HttpContext.Session["Login_User"] != null) { Mad_User user = filterContext.HttpContext.Session["Login_User"] as Mad_User; if (!user.is_super) { if (!GetPopedom(user).Exists(p => p.Controller_Name == controllerName.ToLower() && p.Action_Name == actionName.ToLower())) { filterContext.HttpContext.Response.Write("没有权限"); filterContext.Result = new EmptyResult(); } } } } /// <summary> /// 获取当前用户所有有权限执行的动作 /// </summary> /// <returns></returns> public List<Atmodel> GetPopedom(Mad_User user) { List<Atmodel> ats = new List<Atmodel>(); List<Mad_Popedom> pops = Mad_PopedomBLL.GetPopedombyUser(user.user_id); foreach (Mad_Popedom pop in pops) { ats.Add(new AtModel() { Controller_Name = pop.Control, Action_Name = pop.Action }); } return ats; } } }
解释一下,上面的代码就是在执行前,先获取登录用户可以运行的Controller-Action,然后和当前需要执行的Controller-Action比较,如存在,即通过,否则为没有权限执行。 3.为动作添加权限 为简单起见,对于Controller层我是独立出来一个类库的,好处是等会为角色添加权限的时候我们不需要手动输入,只要反射dll就可以了。 [img]http://files.jb51.net/upload/2010-2/20100225092208118.png[/img] 如图所示,凡需要权限控制的函数,只需要添加[SupportFilter]特性就可以了,当然这种方式只能控制到Action级。 4.为角色额添加权限 这个比较简单,只需要把角色和权限关联起来就可以了,这里我是用反射Controller层dll实现。 Web.config [img]http://files.jb51.net/upload/2010-2/20100225092208481.png[/img] Global.asax.cs [img]http://files.jb51.net/upload/2010-2/20100225092208607.png[/img] Madnet.Controllers.Test即为Controller层的dll [img]http://files.jb51.net/upload/2010-2/20100225092209394.png[/img] Test为Controller名,index为Action名,选择role2可以访问的Action,提交到数据库即可。此图表示role2拥有Test1Controller的访问权限,但是没有Test2Controller,Test3Controller的访问权限。 5.结束 上面4步即已完成基本的权限控制。可以在此基础上加上用户组,用户,菜单等管理,可实现”用户-角色-权限”的自由组合,一个简单的通用后台大概就是这样了。 [img]http://files.jb51.net/upload/2010-2/20100225092209232.png[/img]
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部