Code Bye

使用MVC过滤器来校验用户登录及权限控制

目前要使用MVC过滤器来校验用户是否登录以及实现一些简单权限控制的功能。参照网上的资料重写了ActionFilterAttribute类里面的OnActionExecuting方法,说是在Action执行之前会先执行该方法。代码:
pre class=”brush: csharp”>
    public class AuthorizeFilter : ActionFilterAttribute
    {
        //Action方法执行之前执行此方法       
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.RouteData.Values[“controller”].ToString().Contains(“Login”))return;
            base.OnActionExecuting(filterContext);
            //校验用户是否已经登录           
            if (UserCookie.UserId == null || UserCookie.UserName == null)
            {   //跳转到登陆页    
                filterContext.HttpContext.Response.Redirect(“/Login/LoginIndex”);
            }
            else
            {
               
                string conName = filterContext.RouteData.Values[“controller”].ToString();
                if (conName.Contains(“Home”)) return;
                string actName = filterContext.RouteData.Values[“action”].ToString();
                LoginBLL _bll = new LoginBLL();
                if(!_bll.GetPermission(UserCookie.UserId,conName,actName))//判断用户是否有权限执行Action
                {
                    return;
                    //filterContext.HttpContext.Response.Redirect(“~/Login/ErroPage”);
                }
            }
        }
    }
/pre>
目前的问题是,虽然在执行每个加过过滤器的Action之前会执行OnActionExecuting方法,但是执行完OnActionExecuting之后,Action也会被执行。比如这里:
pre class=”brush: csharp”>
 [AuthorizeFilter]
        public bool ChangeState(string type,string id, int state)
        {
            return _bll.ChangeState(type,id, state);
        }
/pre>
AuthorizeFilter过滤器判断操作人是没有权限执行ChangeState的,但是判断完之后它却直接走到ChangeState方法里面去了,即使在在过滤器里跳转了也没用。这是怎么回事,是跳转方式有问题还是过滤器其他地方未完善的原因?还有,如果没有权限的话直接在当前页面弹窗提示而不是跳转页面又该怎么实现呢?

 

40分
 base.OnActionExecuting(filterContext);
这句放在判断里面去,你前面就已经执行方法,当然不行。

10分
引用 7 楼 u013324517 的回复:
Quote: 引用 6 楼 starfd 的回复:

你应该是要RedirectView吧?

不是的,我是想弄成弹窗的模式,而不是跳转。毕竟点一个按钮没有权限就跳转页面体验不大好。

弹窗是js的事情了啊,亲,那你可以直接返回一个Response,包含特定的标志头的,然后你的js监控这个Response头,有这个标志头的就弹个窗呗

引用 8 楼 lc2737 的回复:

 base.OnActionExecuting(filterContext);
这句放在判断里面去,你前面就已经执行方法,当然不行。

谢谢这位大神的提点,一语惊醒梦中人哪。也谢谢其他各位的回答!


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明使用MVC过滤器来校验用户登录及权限控制