asp.net MVC 权限设计 asp.net MVC 权限设计(续)
表说明? ControllerAction?
IsAllowedNoneRoles,IsAllowedAllRoles实现了允许所有人访问以及允许所有注册用户访问:),并且我们约定,IsAllowedNoneRoles具有最高的优先级,其次是IsAllowedAllRoles,然后才是ControllerActionRole中定义的规则 ? ? ControllerActionRole
?其他几张表一看就明白,不再多说 ? 判断是否有权限的设定? ??? 1、获取controller,action,以及存放在session中的用户信息
1 publicclass UserAuthorizeAttribute : AuthorizeAttribute
2 { 3 4 overridevoid OnAuthorization(AuthorizationContext filterContext) 5 { 6 var user = filterContext.HttpContext.Session["CurrentUser"] as User; 7 var controller filterContext.RouteData.Values[controller].ToString(); 8 var action action 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
bool IsAllowed(User user,string controllerName,1)"> actionName)
{ var service ServiceLoader.LoadService<ToySpirit.IToySpiritService.IControllerActionService>(); // 获取对应的controller ? var controller service.GetSingleByExpression(c => c.Name == controllerName && c.IsController); (controller !=null) { 获取对应的action var controllerAction service.GetSingleByFunc(c actionName c.IsController false c.ControllerName controllerName); return controllerAction ?.isAllowed(user,controller) : } 没有定义controller的权限,表示无需权限控制 true; ? ? 4、如果有action的记录,那么我们首先判断controllerAction 拒绝哪些角色访问,如果用户有角色在这里面,很遗憾,就不能访问了;然后判断controllerAction 允许哪些角色访问,如果用户的角色在这里面,就可以访问了 注:这里很有可能用户有多个角色,比如A,B,C,如果A不能访问controllerAction,那么很遗憾,用户不能访问,尽管角色B,C可能可以访问该controllerAction 5、没有action的记录,自然就检查controller对应的controllerAction 了 ?
4、5判断的代码是一样的,如下:
private isAllowed(User user,ControllerAction controllerAction) { 允许没有角色的:也就是说允许所有人,包括没有登录的用户 (controllerAction.IsAllowedNoneRoles) { ; } 允许所有角色:只要有角色,就可以访问 (controllerAction.IsAllowedAllRoles) { user.Roles.Count >0 (user ||==) { 选出action对应的角色 var roles controllerAction.ControllerActionRoles.Select(ca ca.Role).ToList(); (roles.Count 角色数量为0,也就是说没有定义访问规则,默认允许访问 ; } var userHavedRolesids user.Roles.Select(r r.ID).ToList(); 查找禁止的角色 var notAllowedRoles controllerAction.ControllerActionRoles.FindAll(r r.IsAllowed ).Select(ca (notAllowedRoles.Count foreach (Role role in notAllowedRoles) { 用户的角色在禁止访问列表中,不允许访问 (userHavedRolesids.Contains(role.ID)) { ; } } } 查找允许访问的角色列表 var allowRoles r.IsAllowed).Select(ca (allowRoles.Count allowRoles) { 用户的角色在访问的角色列表 ; } ? ? ? 使用方法:? 建立一个basecontroller,使用我们定义好的UserAuthorize,然后所有的controller继承basecontroller就可以了
1 ///<summary>
2 /// 控制基类 3 </summary>4 [UserAuthorize] 5 abstract BaseController : Controller 6 {} 7 8 HomeController : BaseController{} 9 ? ? ? 演示:? 在controlleraction中添加几条数据: 根据我们的规则,我们可以知道,未登录的用户可以访问Home/Public,其他几个页面则不能访问 我们看对应的Action:
ViewPage()
{ Response.Write(View } Public() Public Delete() Delete } ? 访问Home/Public,如果有权限,那么显示“Public“,否则显示”无权访问” 未登录用户访问Home/Public,结果符合我们的约定;-) 未登录用户访问Home/ViewPage,按约定应该显示错误信息 查看 asp.net MVC 权限设计(续) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – MVC:路由获取/发布到不同的控制器 怎么样
- asp.net核心 – ASP – 启动时核心迁移EF核心SQL DB
- asp.net-mvc – ASP.NET MVC – 表单和模型绑定器中的多个模
- asp.net-mvc – 适用于典型n层架构的Web API在哪里?
- iis-7 – 在iis7上设置经典的asp站点,站点运行但可以看到服
- 如何在asp.net中打开MS Office word?
- ASP.NET应用程序未记录到Windows事件日志
- 如何从ASP.NET Web API返回已排序的字典
- asp.net-mvc – ASP.NET MVC WebApi:没有为此对象定义的无
- asp.net-mvc-4 – 禁止从地址栏调用操作方法
- asp.net-mvc – 在数组中使用jqAutocomplete
- 如何创建ASP.NET Web场?
- 在ASP.NET MVC中使用Razor创建可重用的HTML视图组
- ASP.NET主题 – 应该使用它们吗?
- asp.net-mvc – ASP.NET Web优化 – 无需捆绑即可
- ASP.NET MVC的必备知识
- asp.net – 任何方式构建Google文档,如PDF文件的
- asp.net – RouteTable.Routes和HttpConfigurati
- asp.net-mvc – TempData keep()vs peek()
- asp.net-web-api – WebApi – 传递一组值