C# asp.net MVC 权限设计(续)

因为是转载文章 在此标明出处,以前有文章是转的没标明的请谅解,因为有些已经无法找到出处,或者与其它原因。

如有冒犯请联系本人,或删除,或标明出处。

因为好的文章,以前只想收藏,但连接有时候会失效,所以现在碰到好的直接转到自己这里。

原文 出处http://www.cnblogs.com/xiaoqi/archive/2011/01/24/1942880.html


asp.net MVC 权限设计一文中没有demo放出来,应大家的要求,这里补充上文并放出demo。

 

几点说明:

 

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

    2、通过自定义AuthorizeAttribute实现

    3、demo 仅供参考,一些规则可以根据实际情况重新定义

 

简明需求

1、可以对每个action实现权限控制,并且可以在数据库动态配置

2、权限分为允许所有人访问、允许注册用户访问、允许\禁止特定角色人访问

 

数据库设计

C# asp.net MVC 权限设计(续)_第1张图片

 

在demo里不使用数据库,这里给出表对应的类

核心流程

C# asp.net MVC 权限设计(续)_第2张图片

 

我们见一个Database类来模拟数据库

来看我们的主要代码

   /// <summary>
/// 自定义AuthorizeAttribute
/// </summary>
public  class  UserAuthorizeAttribute : AuthorizeAttribute
{
 
     public  override  void  OnAuthorization(AuthorizationContext filterContext)
     {
         var  user = filterContext.HttpContext.Session[ "CurrentUser" ] as  User;
 
         // 用户为空,赋予Guest
         if  (user == null )
         {
             user = Database.Users.Find(u => u.Name == "Guest" );
         }
 
         var  controller = filterContext.RouteData.Values[ "controller" ].ToString();
         var  action = filterContext.RouteData.Values[ "action" ].ToString();
         var  isAllowed = this .IsAllowed(user, controller, action);
 
         if  (!isAllowed)
         {
             filterContext.RequestContext.HttpContext.Response.Write( "无权访问" );
             filterContext.RequestContext.HttpContext.Response.End();
         }
 
     }
 
     /// <summary>
     /// 判断是否允许访问
     /// </summary>
     /// <span name="user"> </span>用户
     /// <span name="controller"> </span>控制器
     /// <span name="action"> </span>action
     /// <returns>是否允许访问</returns>
     public  bool  IsAllowed(User user, string  controller, string  action)
     {
 
         // 找controllerAction
         var  controllerAction = Database.ControllerActions.Find(ca => ca.IsController == false  && ca.Name == action && ca.ControllName == controller);
 
         //action无记录,找controller
         if  (controllerAction == null )
         {
             controllerAction = Database.ControllerActions.Find(ca => ca.IsController && ca.Name == controller);
         }
 
         // 无规则
         if  (controllerAction == null )
         {
             return  true ;
         }
 
 
         // 允许没有角色的:也就是说允许所有人,包括没有登录的用户
         if  (controllerAction.IsAllowedNoneRoles)
         {
             return  true ;
         }
 
         // 允许所有角色:只要有角色,就可以访问
         if  (controllerAction.IsAllowedAllRoles)
         {
             var  roles = Database.UserRoles.FindAll(ur => ur.UserId == user.Id);
             if  (roles.Count > 0)
             {
                 return  true ;
             }
             else
             {
                 return  false ;
             }
         }
 
 
         // 选出action对应的角色
         var  actionRoles = Database.ControllerActionRoles.FindAll(ca => ca.ControllerActioId == controllerAction.Id).ToList();
 
         if  (actionRoles.Count == 0)
         {
             // 角色数量为0,也就是说没有定义访问规则,默认允许访问
             return  true ;
         }
 
         var  userHavedRolesids = Database.UserRoles.FindAll(ur => ur.UserId == user.Id).Select(ca => ca.RoleId).ToList();
 
         // 查找禁止的角色
         var  notAllowedRoles = actionRoles.FindAll(r => !r.IsAllowed).Select(ca => ca.RoleId).ToList();
         if  (notAllowedRoles.Count > 0)
         {
             foreach  ( int  roleId in  notAllowedRoles)
             {
                 // 用户的角色在禁止访问列表中,不允许访问
                 if  (userHavedRolesids.Contains(roleId))
                 {
                     return  false ;
                 }
             }
         }
 
         // 查找允许访问的角色列表
         var  allowRoles = actionRoles.FindAll(r => r.IsAllowed).Select(ca => ca.RoleId).ToList();
         if  (allowRoles.Count > 0)
         {
             foreach  ( int  roleId in  allowRoles)
             {
                 // 用户的角色在访问的角色列表
                 if  (userHavedRolesids.Contains(roleId))
                 {
                     return  true ;
                 }
             }
         }
 
         // 默认禁止访问
         return  false ;
     }
 
}

测试

[HandleError]
[UserAuthorize]
public  class  HomeController : Controller
{
     public  ActionResult Index()
     {
         ViewData[ "Message" ] = "欢迎使用 ASP.NET MVC!" ;
 
         return  View();
     }
     public  ActionResult Admin()
     {
         ViewData[ "Message" ] = "只有管理员才能访问!" ;
 
         return  View( "Index" );
     }
     public  ActionResult User()
     {
         ViewData[ "Message" ] = "只要是注册用户就能访问!" ;
 
         return  View( "Index" );
     }
     public  ActionResult UserOnly()
     {
         ViewData[ "Message" ] = "只能是User才能能访问!" ;
 
         return  View( "Index" );
     }
 
     public  ActionResult Login( string  user)
     {
         Session[ "CurrentUser" ] = Database.Users.Find(u => u.Name == user);
         if  (Session[ "CurrentUser" ] != null )
         {
             ViewData[ "Message" ] = "你已登录为"  + user;
         }
 
         return  View( "Index" );
     }
 
 
     public  ActionResult About()
     {
         return  View();
     }
}

 

1、登录为Admin

C# asp.net MVC 权限设计(续)_第3张图片

 

访问Admin

C# asp.net MVC 权限设计(续)_第4张图片

 

访问User

C# asp.net MVC 权限设计(续)_第5张图片

 

访问UserOnly

C# asp.net MVC 权限设计(续)_第6张图片

 

2、登录为User

C# asp.net MVC 权限设计(续)_第7张图片

 

访问Admin

image

 

访问User

C# asp.net MVC 权限设计(续)_第8张图片

访问UserOnly

C# asp.net MVC 权限设计(续)_第9张图片

 

demo下载 MVCRole.rar


你可能感兴趣的:(C# asp.net MVC 权限设计(续))