之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证。此篇文章大致讲解下 精确到按钮级别的验证如何实现、以及权限验证设计的参考思路(菜鸟一枚,大神勿喷)。
在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码,那我们可以通过AOP截取实现,而在MVC项目中我们就可以直接使用它提供的Filter的特性帮我们解决,不用自己实现复杂的AOP了。
在Asp.NET Mvc中当你有以下及类似以下需求时你可以使用Filter(过滤器)功能
判断登录与否或用户权限
决策输出缓存
防盗链
防蜘蛛
本地化与国际化设置
实现动态Action
第一节:知识储备
Asp.Net MVC提供了以下几种默认的Filter:
大家注意一点,Asp.Net MVC提供的ActionFilterAttribute默认实现了IActionFilter和IResultFilter。而ActionFilterAttribute是一个Abstract的类型,所以不能直接使用,因为它不能实例化,所以我们想使用它必须继承一下它然后才能使用。
Filter继承于ActionFilterAttribute抽象类,并可以覆写 void OnActionExecuting(ActionExecutingContext) voidOnActionExecuted(ActionExecutedContext) void OnResultExecuting(ResultExecutingContext) void OnResultExecuted(ResultExecutedContext)。
它们的执行先后顺序如下:
OnActionExecuting是Action执行前的操作
OnActionExecuted则是Action执行后的操作
OnResultExecuting是解析ActionResult前执行
OnResultExecuted是解析ActionResult后执行
接下来我们只要对以上的方法进行重写就可以在相应的步骤做一些操作了。
第二节:Filter实战光说不练假把式,下面我给大家一个示例,来看看它们的执行顺序,,首先添加一个普通的类TestFilterAttribute,这个类要继承ActionFilterAttribute,代码如下:
1 /// <summary> 2 /// Filter 执行顺序Test,需要继承筛选器的基类ActionFilterAttribute 3 /// </summary> 4 public class TestFilterAttribute : ActionFilterAttribute 5 { 6 public string Message { get; set; } 7 8 public override void OnActionExecuting(ActionExecutingContext filterContext) 9 { 10 base.OnActionExecuting(filterContext); 11 filterContext.HttpContext.Response.Write("Action执行之前" + Message + "<br />"); 12 } 13 14 public override void OnActionExecuted(ActionExecutedContext filterContext) 15 { 16 base.OnActionExecuted(filterContext); 17 filterContext.HttpContext.Response.Write("Action执行之后" + Message + "<br />"); 18 } 19 20 public override void OnResultExecuting(ResultExecutingContext filterContext) 21 { 22 base.OnResultExecuting(filterContext); 23 filterContext.HttpContext.Response.Write("返回Result之前" + Message + "<br />"); 24 } 25 26 public override void OnResultExecuted(ResultExecutedContext filterContext) 27 { 28 base.OnResultExecuted(filterContext); 29 filterContext.HttpContext.Response.Write("返回Result之后" + Message + "<br />"); 30 } 31 }
写完这个代码后,我们回到Action上,打上上面的标记如下所示: