程序员的自我救赎---7.2:权限系统实际应用
《权限系统实际应用》
讲到权限系统的应用,我们需要回过头来看看《SSO及应用案例》,之前讲SSO的应用中有讲到特性类[AuthLogin] 和 [AuthRight]。
关于[AuthLogin] 前面已经讲过了,其实 [AuthRight]的应用和[AuthLogin] 是一样的,我们以特性类的方式表示哪个界面需要验证权限(Controller)。
用法也很简单:
关于AuthRight 的具体实现在Winner.FrameWork.MVC中,可以看这篇文章了解这一块:核心框架讲解(MVC)。
具体实现其实也很简单:
using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Winner.Framework.MVC.GlobalContext; using Winner.Framework.Utils.Model; namespace Winner.Framework.MVC { /// <summary> /// 验证身份:检查访问权限 /// </summary> public class AuthRightAttribute : AuthLoginAttribute { /// <summary> /// 实例化一个新的验证对象 /// </summary> /// <param name="ignore">是否忽略检查</param> public AuthRightAttribute(bool ignore = false) : base(ignore) { } /// <summary> /// 权限验证,继承登陆验证 /// </summary> /// <param name="context"></param> protected override bool OnAuthorizationing(AuthorizationContext context) { //1.判断是否登陆成功 if (!base.OnAuthorizationing(context)) { return false; } //2.忽略权限检查 if (GlobalConfig.IgnoreCheckRight) { return true; } //3.如果是Ajax请求则不检查权限 if (base.ContextProvider.IsAjaxRequest && GlobalConfig.IgnoreAjaxRequestCheckRight) { return true; } //4.获取路径,如:/区域/控制器/动作/ string url = string.Empty; if (!string.IsNullOrEmpty(ContextProvider.Area)) { url = "/" + ContextProvider.Area; } url += string.Format("/{0}/{1}/", ContextProvider.Controller, ContextProvider.Action); //5.判断权限 if (!ApplicationContext.HaveRight(ApplicationContext.Current.User.UserId, url)) { //无法跳转到根目录下 //context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Home", action = "Right" })); if (base.ContextProvider.IsAjaxRequest) { OutputResult("此功能未授权,请联系管理员!", 403); } else { //TODO:未测试 指定Default的路由器下的 context.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { Controller = "Home", action = "Right" })); } return false; } return true; } } }
[AuthLogin] 和 [AuthRight] 的区别在于 [AuthLogin]只验证是否登录,登录的都可以浏览和操作, [AuthRight] 则要验证权限系统是否有这个权限。
有打 [AuthRight]特性类,我们就通过WCF或者Webservice去请求"权限系统" 去查询是否该用户有本页面权限,如果没有返回False,则跳到指定的提示页面。
上篇文章中有讲到,我们的权限其实只控制到页面,但是完全是可以让权限控制到按钮的。如果我们在权限系统针对功能扩展表,再扩展一张操作表,配置每个
按钮的名称,最后再把验证的特性类打在控制器的方法上,这就可以讲权限控制到按钮了。就看需要有没有达到这种程序,公司做大了,项目参与人员增多了
还是要做到这一步的。
另外,上一篇文章中也有讲到,我们的权限系统其实还是2006年开发的,中间虽然完善过几次,但是对于访问权限系统做的并不好。中间我们还一度追求新技术
使用WCF来做的,也没怎么做的好。这边重构权限系统的话,我们还是希望以简单一点的方式,比如WebAPI来完成接口请求。
哈哈,本来觉得关于权限系统的实际应用是有很多东西可以讲,但是发现其实在上一篇《权限系统》和《核心框架讲解(MVC)》 都各带到了一些。
无非就三个重点:
1,以特性类[AuthRight]的形式来做权限检查
2,在Winner2.0的核心框架中集成权限验证
3,权限系统的控制可精细化到按钮
另外,虽然之前也有提到过。但是我再强调一遍,权限系统一定要有忽略权限检查的功能(包括忽略登录检查)。不然开发的时候很痛苦,一来是每次调试都要登录,
二来是开发过程中每增加一个功能还要先去线下的权限系统,添加权限。
所以Winner2.0在设计的时候都会有像:GlobalConfig.IgnoreCheckRight。这样的通过WebConfig的可配置的检查项。
好了,权限系统差不多就说到这里了,有兴趣一起探讨Winner框架的可以加我们QQ群:261083244。或者扫描左侧二维码加群。