验证操作过滤器或授权过滤器的用户权限?

Posted

技术标签:

【中文标题】验证操作过滤器或授权过滤器的用户权限?【英文标题】:Verify User Permission on Action Filter or Authroize Filter? 【发布时间】:2014-03-24 09:02:38 【问题描述】:

我正在用 MVC4 开发一个网站。我开发了用户角色和权限。

我想问我应该在哪里检查用户权限访问:在自定义操作过滤器中,还是在自定义授权过滤器中?

如果用户无权访问该模块,那么我必须显示烤面包机错误消息。如何在操作过滤器中显示此消息?

【问题讨论】:

使用授权属性 - ***.com/questions/2504923/…。如果有帮助,请告诉我。 【参考方案1】:

我用来编写自定义操作过滤器属性,以便在操作调用时调用此方法,如果用户角色允许他调用此操作,我会检查它。

您必须以相同的方式编写自定义操作过滤器属性,但您必须在 CheckAccessRight 方法中编写自己的业务逻辑:

public class AuthorizationAttribute : ActionFilterAttribute

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    
        string actionName = filterContext.ActionDescriptor.ActionName;
        string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;



        if (!CheckAccessRight(actionName, controllerName))
        
            string redirectUrl = string.Format("?returnUrl=0", filterContext.HttpContext.Request.Url.PathAndQuery);

            filterContext.HttpContext.Response.Redirect(FormsAuthentication.LoginUrl + redirectUrl, true);
        
        else
        
            base.OnActionExecuting(filterContext);
        
    


    private bool CheckAccessRight(string Action, string Controller)
    
        if (HttpContext.Current.Session["userId"] != null)
        
            string userID = HttpContext.Current.Session["userId"].ToString();
            using (var db = new cloud_clinicEntities())
            
                assignment objAss = null;
                if (HttpContext.Current.Session["AccountType"].ToString() == "lab")
                
                    objAss = db.assignments.SingleOrDefault(model => model.userid == userID);
                
                else
                
                    objAss = db.assignments.SingleOrDefault(model => model.employeeId == userID);
                

                String UserRole = objAss.itemname;

                itemchildren objChild = db.itemchildrens.SingleOrDefault(model => model.parent == UserRole && model.child == Controller + " " + Action);

                if (objChild != null)
                
                    return true;
                
                else
                
                    return false;
                


            
        
        else
        
            return false;
        
    

然后在这样的动作上使用这个属性:

[AuthorizationAttribute]
        public ActionResult MyAction()
        
        

【讨论】:

【参考方案2】:

Here's一篇好文章。您可以为管理员等多个角色设置自己的属性。

【讨论】:

以上是关于验证操作过滤器或授权过滤器的用户权限?的主要内容,如果未能解决你的问题,请参考以下文章

036 权限控制介绍 - bos

如何让spring security不拦截第三方的对接方法

Shiro权限总结

⭐基于bootstap-Jquery-JSP-Servlet-mysql⭐博客项目——后台用户退出过程和过滤器管理后台的权限验证实现

⭐基于bootstap-Jquery-JSP-Servlet-mysql⭐博客项目——后台用户退出过程和过滤器管理后台的权限验证实现

基于session做的权限控制