Lind.DDD.Authorization用(yong)戶授權介(jie)紹
Lind.DDD.Authorization是(shi)Lind.DDD框架(jia)的(de)組成部分,之所以把它(ta)封(feng)裝到框架(jia)里,原因就是(shi)它(ta)的(de)通用(yong)性,幾乎在任(ren)何(he)一(yi)個系(xi)統中,都(dou)少不了用(yong)戶(hu)授(shou)權(quan)功(gong)能(neng),用(yong)戶(hu)授(shou)權(quan)對于任(ren)何(he)一(yi)個系(xi)統來說都(dou)是(shi)必要的(de),像管(guan)理型的(de)頁面都(dou)需(xu)要用(yong)戶(hu)先去登(deng)陸,然后拿到憑(ping)證,才可(ke)以進行訪問(wen),這在MVC和(he)WebApi體系(xi)結構里是(shi)很容易實現(xian)的(de),像過濾器(qi)里的(de)AuthorizeAttribute和(he)ActionFilterAttribute都(dou)可(ke)以實現(xian)用(yong)戶(hu)授(shou)權(quan)的(de)功(gong)能(neng)。
AuthorizeAttribute和ActionFilterAttribute
AuthorizeAttribute這個過(guo)濾(lv)器從字面(mian)上就可以看出它的(de)(de)(de)功能,它主要(yao)(yao)用(yong)(yong)在(zai)用(yong)(yong)戶角色授權(quan)上,對于我(wo)(wo)們(men)(men)的(de)(de)(de)系(xi)統(tong)來說(shuo),那就是哪些頁面(mian)需要(yao)(yao)登陸,就把哪個Action添加這個特性,它有方法OnAuthorization,表示當(dang)頁面(mian)加載之前(qian),去判斷用(yong)(yong)戶是否(fou)有訪問本action的(de)(de)(de)權(quan)限(xian),我(wo)(wo)們(men)(men)可以根據自己的(de)(de)(de)需要(yao)(yao)去override它;ActionFilterAttribute過(guo)濾(lv)器是我(wo)(wo)們(men)(men)平時(shi)用(yong)(yong)的(de)(de)(de)最多的(de)(de)(de),即(ji)在(zai)action執行前(qian),后,View渲染(ran)前(qian),渲染(ran)后的(de)(de)(de)跟蹤,我(wo)(wo)們(men)(men)在(zai)使用(yong)(yong)時(shi),重(zhong)寫對應的(de)(de)(de)方法,即(ji)可以實現對各(ge)個步驟的(de)(de)(de)跟蹤。
實現原理,方法攔截
在mvc里(li),過濾(lv)器(qi)的含義(yi)就是方(fang)法(fa)攔(lan)(lan)截,這個概(gai)念(nian)和Aop不(bu)某而(er)合,都是對方(fang)法(fa)進(jin)行(xing)攔(lan)(lan)截,然后進(jin)行(xing)二(er)次加(jia)工(gong),過濾(lv)器(qi)的原理也一樣,在進(jin)行(xing)攔(lan)(lan)截后,可以去(qu)填充你自己(ji)的業(ye)務邏輯,然后選擇繼續渲染(ran)還是離開頁面。
AuthorizationLoginFilter過濾器的實現
下(xia)面是我自己(ji)整理的,用戶授權的一個過濾器,分(fen)享一下(xia)
/// <summary> /// 授(shou)權過濾(lv)器(qi) /// Function:MVC模式下使用(yong) /// Author:Lind.zhang /// </summary> public class AuthorizationLoginFilter : AuthorizeAttribute { /// <summary> /// 驗證(zheng)失敗后所指向的控制(zhi)器和action /// 可(ke)以在(zai)使(shi)用特(te)性時為它進行(xing)賦值 /// </summary> public AuthorizationLoginFilter(string failControllerName = "Home", string failActionName = "Login") { _failControllerName = failControllerName; _failActionName = failActionName; } public string _failControllerName, _failActionName; public override void OnAuthorization(AuthorizationContext filterContext) { //被添加AllowAnonymousAttribute特(te)性的過濾器將不參加AuthorizationLoginFilter的驗證 bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true); //為登陸頁(ye)添(tian)加(jia)例外,其它(ta)頁(ye)都自動在global.asax里添(tian)加(jia)到全局(ju)過濾器中,MVC3及(ji)以(yi)后版(ban)本支持它(ta) if (!skipAuthorization) { if (!CurrentUser.IsLogin) { filterContext.Result = new RedirectToRouteResult("Default", new RouteValueDictionary { { "Action",_failActionName }, { "Controller", _failControllerName}, { "returnUrl", HttpContext.Current.Request.Url.ToString() } }); } } } }
授權模塊的CurrentUser的實現
對于過濾(lv)器把沒有(you)登(deng)(deng)陸(lu)的用(yong)戶(hu)指(zhi)引(yin)登(deng)(deng)陸(lu)頁后,用(yong)戶(hu)將(jiang)進(jin)行登(deng)(deng)陸(lu)操作,然后Lind.DDD要(yao)(yao)做什么?需要(yao)(yao)將(jiang)用(yong)戶(hu)標(biao)示(shi),角(jiao)色(se)信息,權(quan)限信息進(jin)行存儲,這時就是我們CurrentUser登(deng)(deng)場的時候(hou)了,設計很簡(jian)單,一(yi)個方法用(yong)來(lai)持久化(hua)用(yong)戶(hu)授權(quan)的對象,幾個屬性用(yong)來(lai)返回需要(yao)(yao)返回的內(nei)容,呵(he)呵(he) !
/// <summary> /// 當(dang)前登(deng)陸的(de)用戶信(xin)息 /// 可以有Redis Session和Session進行實現 /// </summary> public class CurrentUser { #region Public Properties /// <summary> /// 當然登(deng)陸的用(yong)戶ID /// </summary> public static string UserID { get { return (System.Web.HttpContext.Current.Session["UserID"] ?? string.Empty).ToString(); } } /// <summary> /// 當前(qian)登陸(lu)的用戶名(ming) /// </summary> public static string UserName { get { return (System.Web.HttpContext.Current.Session["UserName"] ?? string.Empty).ToString(); } } /// <summary> /// 用戶角色 /// </summary> public static string Role { get { return (System.Web.HttpContext.Current.Session["Role"] ?? string.Empty).ToString(); } } /// <summary> /// 用戶權限 /// 增,刪,改,查 /// </summary> public static string Authority { get { return (System.Web.HttpContext.Current.Session["Authority"] ?? string.Empty).ToString(); } } /// <summary> /// 當前登陸(lu)用戶存儲的擴展信息 /// </summary> public static string ExtInfo { get { return (System.Web.HttpContext.Current.Session["ExtInfo"] ?? string.Empty).ToString(); } } /// <summary> /// 是否登(deng)陸 /// </summary> public static bool IsLogin { get { return !string.IsNullOrWhiteSpace(UserID); } } #endregion #region Public Methods /// <summary> /// 退出登陸 /// </summary> public static void Exit() { System.Web.HttpContext.Current.Session.Abandon();//清(qing)除(chu)全(quan)部(bu)Session } /// <summary> /// 將用(yong)戶信息持久化到Session /// </summary> /// <param name="userID"></param> /// <param name="userName"></param> /// <param name="ExtInfo"></param> public static void Serialize( string userID, string userName, string extInfo = "", string role = "", string authority = "") { System.Web.HttpContext.Current.Session["UserID"] = userID; System.Web.HttpContext.Current.Session["UserName"] = userName; System.Web.HttpContext.Current.Session["ExtInfo"] = ExtInfo; System.Web.HttpContext.Current.Session["Role"] = role; System.Web.HttpContext.Current.Session["Authority"] = authority; } #endregion }
OK,對于(yu)Lind.DDD.Authorization用(yong)戶授權這塊就說到這里,如果對大家(jia)有幫(bang)助,請您點個贊(zan)吧!