MVC權限驗證過濾器

第一步:設置屬性

namespace ZSZ.Admin.Web.App_Start
{

    [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]   //只能標記在方法上面,可以同時有多個標記存在
    public class CheckPermissionAttribute : Attribute
    {
        public string Name { get; set; }
        public CheckPermissionAttribute(string name)
        {
            this.Name = name;
        }
    }
}

第二步:設置權限過濾器
(一共分爲四種情況。session爲NULL的不管是不是ajax請求造成的,都要退回登錄頁面,session保存了用戶信息的時候,就要檢查該用戶是否有某種權限。回覆ajax請求和非ajax請求的方法不一樣)

namespace ZSZ.Admin.Web.App_Start
{
    public class ZSZAuthorizationFilter : IAuthorizationFilter
    {
        public IAdminUserService AdminUser { get; set; }
        //每個action執行之前都會執行次方法
        public void OnAuthorization(AuthorizationContext filterContext)
        {

            //0:先獲取要執行的action上面的attribute標記
            //1:看是否登錄,沒有登錄就返回登錄頁面,登錄的話在做後續的判斷
            //2:後續的判斷就是看有沒有執行此action的權限
            CheckPermissionAttribute[] checkPermissions = (CheckPermissionAttribute[])filterContext.ActionDescriptor.GetCustomAttributes(typeof(CheckPermissionAttribute), false);//獲取所有標記的特性
            if (checkPermissions.Length <= 0)
            {
                //說明沒有標記任何特性
                return;//跳出過濾器,繼續執行後續的action
            }

            //取出session的值,看是否爲null
            long? loginID = (long?)filterContext.HttpContext.Session["LoginID"];
            if (loginID == null)
            {
                //說明未登錄,返回登錄頁面
                //思考:如何判斷請求是來自form提交請求還是ajax請求,進而做不同的處理
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    //這是AJAX請求
                    AjaxResult aj = new AjaxResult();
                    aj.Data = "/main/Login";
                    aj.Status = "redirect";
                    aj.ErrorMsg = "用戶未登錄";
                    //filterContext.Result只要被賦值,就不會再繼續執行原本想要執行的action,而是會返回result的結果
                    filterContext.Result = new JsonResult() { Data = aj };
                }
                else
                {
                    //表單請求
                    filterContext.Result = new RedirectResult("~/Main/login");

                }
            }
            else
            {
                AdminUser = new AdminUserService();//獲取接口實現類的對象

                //推薦下面的用法:
                //由於ZSZAuthorizeFilter不是被autofac創建,因此不會自動進行屬性的注入
                //需要手動獲取Service對象
                //IAdminUserService userService =
                //    DependencyResolver.Current.GetService<IAdminUserService>();


                //已登錄。做權限的判斷
                foreach (var permAtt in checkPermissions)
                {
                    //判斷當前登錄用戶是否具有permAtt.Permission權限
                    //(long)userId   userId.Value
                    if (!AdminUser.HavePermissions(loginID.Value, permAtt.Name))
                    {
                        //只要碰到任何一個沒有的權限,就禁止訪問
                        //在IAuthorizationFilter裏面,只要修改filterContext.Result 
                        //那麼真正的Action方法就不會執行了
                        if (filterContext.HttpContext.Request.IsAjaxRequest())
                        {
                            AjaxResult ajaxResult = new AjaxResult();
                            ajaxResult.Status = "error";
                            ajaxResult.ErrorMsg = "沒有權限" + permAtt.Name;
                            filterContext.Result = new JsonResult { Data = ajaxResult };
                        }
                        else
                        {
                            filterContext.Result
                           = new ContentResult { Content = "沒有" + permAtt.Name + "這個權限" };
                        }
                        return;
                    }
                }
            }
        }
    }
}

第三步:在global.asax註冊

GlobalFilters.Filters.Add(new ZSZAuthorizationFilter()); //增加權限判斷的處理器

第四步:在controller的action上標記屬性

 [CheckPermission("lookAdmin")]
        public ActionResult Index()
        {
            var listAdmin = AdminUserService.GetAll();
            return View(listAdmin);
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章