最近在做一个.NET MVC框架的后台项目,涉及到5个权限,而控制器下的方法有些只能高权限用户使用,低权限用户不能访问,一开始是在方法里面写判断,但是功能方法多了以后,发现代码重复的很严重,不符合面向对象的思想,所以找到了过滤器这个利器。
过滤器(Filter)把附加逻辑注入到MVC框架的请求处理,实现了交叉关注,非常适用于登录、授权以及缓存等。 ---《精通ASP.NET MVC4》
过滤器里主要有以下这5个方法,Exception 用来抓异常,也可以在里面写异常日志。而身份验证用到的是Authorize
MVC框架自带了一套权限管理过滤功能,由下图可查看其源码
下面我们自己来定义一个Authorize
首先先创建过滤器嘛。
我这里的例子,是在用户登录的时候,就往session容器缓存用户权限,所以我在过滤器里面根据session["quanxian"]来判断
一、在控制器或者方法上面加上过滤
[MyFilter(Roles = "manager,admin,supervisor,operator2")] //这样只有这些权限的用户才能使用这个方法
public ActionResult test()
{
return Content("dddd");
}
二、在过滤器写自己的过滤规则
public class MyFilterAttribute : AuthorizeAttribute
{
//自定义过滤器
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Session["quanxian"] == null) //session都没有,说明没有登录,或者登录过期session被销毁了
{
filterContext.Result = new RedirectResult("/Home/Login");
}
else
{
string quanxian = filterContext.HttpContext.Session["quanxian"].ToString();
if (!Roles.Contains(quanxian)) //如果权限不一致,则不允许访问,要跳转登录页面
{
filterContext.Result = new RedirectResult("/Home/Login");
}
}
}
}
在C#的编译器命名约定中,如果这些注解属性类的名称以Attribute结尾,则可以忽略这部分(例如我们这里的名称是MyFilterAttribute,可以写成[MyFilter])