asp.net MVC 权限设计

来源:互联网 发布:zbrush mac 中文 编辑:程序博客网 时间:2024/05/22 14:23

几点说明:

 

    1、该权限系统是个网站用的,用户简单,因此不涉及到部门这些信息

    2、基于将角色与controller、action相关联来判断用户是否有权

    3、通过重载AuthorizeAttribute实现

 

数据库设计:

  • image 

  •  

表说明

 

ControllerAction 

  1.     Name是controller的名称
  2.     IsController是指是否是controller,如果为false,表示存的是action,那么controllerName字段就派上用场了
  3.     IsAllowedNoneRoles是指是否允许没有权限的人访问
  4.     IsAllowedAllRoles是指是否允许有角色的人访问

IsAllowedNoneRoles,IsAllowedAllRoles实现了允许所有人访问以及允许所有注册用户访问:),并且我们约定,IsAllowedNoneRoles具有最高的优先级,其次是IsAllowedAllRoles,然后才是ControllerActionRole中定义的规则

 

 

ControllerActionRole

 IsAllowed表示该action或者controller是否允许访问,加入表中有两条记录

角色NameControllNameIsAllowedIsController   AAdminHomefalsefalse   AHomeNulltruetrue

     这里约定分两个层次来判断权限:

          第一条记录:表示A角色不能访问 Home/admin

          第二条记录:表示A角色可以访问Controller下的所有方法

     到底能不能访问呢?其实,我们以action为准,如果定义了action,我们直接从action的约定来判断,因此这里判断A不能访问Home/admin

 

 其他几张表一看就明白,不再多说

 

判断是否有权限的设定

 

    1、获取controller,action,以及存放在session中的用户信息

复制代码
 1 public class UserAuthorizeAttribute : AuthorizeAttribute  2     { 3  4      public override void OnAuthorization(AuthorizationContext filterContext)  5       {  6           var user = filterContext.HttpContext.Session["CurrentUser"] as User;  7           var controller = filterContext.RouteData.Values["controller"].ToString();  8           var action = filterContext.RouteData.Values["action"].ToString();  9           var isAllowed = this.IsAllowed(user, controller, action); 10 11           if (!isAllowed) 12           { 13               filterContext.RequestContext.HttpContext.Response.Write("无权访问"); 14               filterContext.RequestContext.HttpContext.Response.End(); 15           } 16 17       }18 19     ……20 21 }22  
复制代码

 

    2、检索数据库ControllerAction表中有没有Name为第一步中controller 的记录,如果没有,我们约定这个controller是不需要进行权限控制的,如果有的话,进入第三步

 

   3、前面提到了,我们约定对权限的控制分为两个层次,controller和action层次,如果同时定义了,以action为准。因此,我们需要判断是否在数据库中有action的记录,如果有,进入4,无,进入5

复制代码
1    /// <summary> 2    /// 控制基类 3    /// </summary> 4     [UserAuthorize] 5    public abstract class BaseController : Controller 6    {}7 8    public class HomeController : BaseController{}9  
复制代码

 

 

演示:

 

在controlleraction中添加几条数据:

image

根据我们的规则,我们可以知道,未登录的用户可以访问Home/Public,其他几个页面则不能访问

我们看对应的Action:

http://www.cnblogs.com/xiaoqi/archive/2011/01/24/1942880.html
原创粉丝点击