第一步:
创建过滤器类:
public class PowerFilter : ActionFilterAttribute
{
public static string newRouteData;
//该方法会在action方法执行之前调用
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
}
//该方法会在action方法执行之后调用
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
/* 先查询数据库的权限表
* 如果进入的页面在权限表中,则运行以下的First,反之直接return
* 然后判断用户的角色权限中是否有该页面的权限
* 有则直接return ,无则返回上一页
* 注意:如果需要判断权限的视图,必须要有相对应的action,否则不会经过过滤器,也就不会判断
*/
/*----------------------------------避免麻烦,先不使用数据库---------------------------------*/
var RouteData = filterContext.RouteData.Values;
newRouteData = string.Format("/{0}/{1}", RouteData["controller"], RouteData["action"]);
var IsPower = (from s in AllPower.PowerList select s).Where(t => t.PowerHref == newRouteData).FirstOrDefault(); //先查询该action是否需要判断权限
if (IsPower != null)
{
/*----------------------------------First----------------------------------------------------------*/
var HavePower = (from u in UserPower.UserPowerList
join p in AllPower.PowerList on u.Powerid equals p.Powerid where p.PowerHref == newRouteData && u.Userid==LoginHelper.CheckCookie().UserID
select new
{
u.Powerid
}
).FirstOrDefault();
if (HavePower !=null) //判断用户是否具有该页面的权限
{
return;
}
else
{
filterContext.HttpContext.Response.Write("<script>alert('您没有权限')</script>");
//如果端口号不属于当前项目,也会等于空,则进入项目首页,否则返回之前的页面
string HistoryUrl = filterContext.HttpContext.Request.UrlReferrer==null? "/Home/Index": filterContext.HttpContext.Request.UrlReferrer.ToString();
filterContext.Result = new RedirectResult(HistoryUrl);
}
/*---------------------------------------------------------------------------------------------*/
}
return;
}
}
第二步:
在App_Start中的FilterConfig中添加权限过滤器
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new PowerFilter()); //权限过滤器
}
}
第三步:
在Global.asax中注册自定义的过滤器
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
//添加自定义的过滤器
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
}
}