中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Lind.DDD.Manager里菜單(dan)權限的(de)設(she)計

回到目錄

對于一(yi)個(ge)后(hou)臺(tai)管理(li)系統來說,你(ni)的(de)(de)權限(xian)設(she)(she)計與安全是重(zhong)中(zhong)之重(zhong),當(dang)你(ni)為一(yi)個(ge)權限(xian)分配一(yi)些菜(cai)單后(hou),當(dang)這(zhe)個(ge)權限(xian)的(de)(de)用戶沒有(you)菜(cai)單權限(xian)時,這(zhe)個(ge)菜(cai)單的(de)(de)URL是不可以(yi)被(bei)用戶訪(fang)問(wen)的(de)(de),而在之前的(de)(de)設(she)(she)計中(zhong),沒有(you)考慮到(dao)這(zhe)點,所以(yi)本次Lind.DDD.Manager的(de)(de)升級(ji)中(zhong),需要把這(zhe)塊完善一(yi)下,將會在8月的(de)(de)Lind.DDD中(zhong)奉獻給大家,敬請期(qi)待!

思路

用戶訪問

==>

mvc根據url找到controller/action

==>

判斷這個URL是否為庫中定義的URL(排除非正常URL,PartialView產生的URL)

==>

判斷用戶是否有這個URL的權限

==>

正常訪問

層關系圖

實現

使用了MVC環境下的AOP方法攔截技術,它主要通過過濾器(AuthorizeAttribute)來實現對action的攔截,然后注入自己的代(dai)碼,這(zhe)也是MVC幾大過(guo)濾器帶給我們的驚喜!

AuthorizeAttribute 為我們提供了一個用戶授權的過濾器,當用戶訪問Action之前,它將被執行

   // 摘要:
    //     表示一個特性,該特性用于限制調(diao)用方對操作方法的(de)訪問。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    {
        // 摘要:
        //     初始化(hua) System.Web.Mvc.AuthorizeAttribute 類的新(xin)實例。
        public AuthorizeAttribute();

        // 摘(zhai)要:
        //     獲取(qu)或(huo)設置用戶(hu)角色。
        //
        // 返回(hui)結果(guo):
        //     用(yong)戶角色。
        public string Roles { get; set; }
        //
        // 摘要:
        //     獲取此特性的唯一標識符。
        //
        // 返回(hui)結果:
        //     此特性(xing)的唯一(yi)標識符。
        public override object TypeId { get; }
        //
        // 摘要:
        //     獲取或設置授權(quan)用戶。
        //
        // 返回結果:
        //     授權用戶。
        public string Users { get; set; }

        // 摘要:
        //     重寫時,提供一個入口點用于進行自定義授權(quan)檢(jian)查(cha)。
        //
        // 參(can)數:
        //   httpContext:
        //     HTTP 上(shang)下(xia)文,它封裝有關(guan)單個 HTTP 請(qing)求的(de)所(suo)有 HTTP 特定的(de)信息。
        //
        // 返回結果:
        //     如果用戶(hu)已(yi)經(jing)過授權,則(ze)為(wei) true;否則(ze)為(wei) false。
        //
        // 異常(chang):
        //   System.ArgumentNullException:
        //     httpContext 參(can)數為 null。
        protected virtual bool AuthorizeCore(HttpContextBase httpContext);
        //
        // 摘要:
        //     處理未能(neng)授(shou)權的 HTTP 請求。
        //
        // 參(can)數:
        //   filterContext:
        //     封裝(zhuang)有關使用 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 對象包括控制(zhi)器、HTTP 上下(xia)文(wen)、請(qing)求上下(xia)文(wen)、操作(zuo)結(jie)果和路由數(shu)據。
        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
        //
        // 摘要:
        //     在過程請求(qiu)授權(quan)時調用。
        //
        // 參(can)數:
        //   filterContext:
        //     篩選器(qi)上下文,它封裝(zhuang)有(you)關使用 System.Web.Mvc.AuthorizeAttribute 的信息。
        //
        // 異(yi)常:
        //   System.ArgumentNullException:
        //     filterContext 參(can)數為 null。
        public virtual void OnAuthorization(AuthorizationContext filterContext);
        //
        // 摘要:
        //     在緩(huan)存模塊(kuai)請求(qiu)授權時調用。
        //
        // 參(can)數(shu):
        //   httpContext:
        //     HTTP 上下文,它封裝有(you)關單個 HTTP 請求的所(suo)有(you) HTTP 特(te)定(ding)的信息。
        //
        // 返回結果:
        //     對驗證狀態的引用。
        //
        // 異常(chang):
        //   System.ArgumentNullException:
        //     httpContext 參(can)數為 null。
        protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
    }

對(dui)于我們(men)的菜單權限過濾(lv)器,需(xu)要繼承它,我們(men)起(qi)名為ManagerUrlAttribute,下面是大叔設(she)計的代(dai)碼(ma),大家(jia)可以作(zuo)為參(can)考

    /// <summary>
    /// 后臺URL菜單的(de)權限
    /// 需要考慮(lv)到(dao)PartialView的問(wen)題
    /// </summary>
    public class ManagerUrlAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 驗(yan)證失敗后所指向的(de)控制器和action
        /// 可以(yi)在使用特性時為它(ta)進行(xing)賦值
        /// </summary>
        public ManagerUrlAttribute(string failControllerName = "Home", string failActionName = "Login")
        {
            _failControllerName = failControllerName;
            _failActionName = failActionName;
        }
        /// <summary>
        /// 出錯時要跳轉的控制器
        /// </summary>
        string _failControllerName;
        /// <summary>
        /// 出錯時要跳轉的action
        /// </summary>
        string _failActionName;
        /// <summary>
        /// 菜單倉(cang)儲
        /// </summary>
        static IExtensionRepository<WebManageMenus> menuRepository = new ManagerEfRepository<WebManageMenus>(new ManagerContext());
        /// <summary>
        /// 所有(you)已經定義的(de)菜單項
        /// </summary>
        static List<WebManageMenus> allMenuList = menuRepository.GetModel().ToList();

        public override void OnAuthorization(AuthorizationContext filterContext)
        {

            var menuIdArr = Array.ConvertAll<string, int>(CurrentUser.ExtInfo.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries), i => int.Parse(i));
            var menuUrlArr = allMenuList.Where(i => menuIdArr.Contains(i.Id)).Select(i => i.LinkUrl).ToList();
            var controllerName = filterContext.RouteData.Values["controller"].ToString();
            var actionName = filterContext.RouteData.Values["action"].ToString();
            var isValid = allMenuList.FirstOrDefault(i => i.LinkUrl == "/" + controllerName + "/" + actionName) != null;//是否為有效的URL,過(guo)濾分布視圖

            //當前為正常頁(ye)面,不是分布視(shi)圖
            if (isValid)
            {
                //沒(mei)有當前URL的權限,跳到(dao)登陸(lu)頁
                if (!menuUrlArr.Contains("/" + controllerName + "/" + actionName))
                {
                    filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { 
                              { "Action",_failActionName },
                              { "Controller", _failControllerName} });
                }
            }
        }

    }

本(ben)代碼解決了分(fen)布視圖在過濾(lv)器中的(de)(de)(de)尷尬,將分(fen)布視圖產生的(de)(de)(de)action進(jin)行(xing)過濾(lv),我(wo)們(men)先將所有定義的(de)(de)(de)菜(cai)單URL取出來,然后用戶訪問時,先判(pan)斷當前URL是否為(wei)已經定義的(de)(de)(de)URL,如果是,再(zai)進(jin)行(xing)權限的(de)(de)(de)比(bi)較.

 回到目錄

posted @ 2016-07-11 16:31  張占嶺  閱讀(1565)  評論(0)    收藏  舉報