程序員的自我救贖---7.2:權限系統實際應用
《前言》
(一) Winner2.0 框架基礎分析
(二)PLSQL報表系統
(三)SSO單點登錄
(四) 短信中心與消息中心
(五)錢包系統
(六)GPU支付中心
(七)權限系統
(八)監控系統
(九)會員中心
(十) APP版本控制系統
(十一)Winner前端框架與RPC接口規範講解
(十二)上層應用案例
(十三)總結
《權限系統實際應用》
講到權限系統的應用,我們需要回過頭來看看《SSO及應用案例》,之前講SSO的應用中有講到特性類[AuthLogin] 和 [AuthRight]。
關於[AuthLogin] 前面已經講過了,其實 [AuthRight]的應用和[AuthLogin] 是一樣的,我們以特性類的方式表示哪個界面需要驗證權限(Controller)。
用法也很簡單:
關於AuthRight 的具體實現在Winner.FrameWork.MVC中,可以看這篇文章了解這一塊:核心框架講解(MVC)。
具體實現其實也很簡單:
using System; using System.Collections.Generic; using System.Dynamic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; using Winner.Framework.MVC.GlobalContext;using Winner.Framework.Utils.Model; namespace Winner.Framework.MVC { /// <summary> /// 驗證身份:檢查訪問權限 /// </summary> public class AuthRightAttribute : AuthLoginAttribute { /// <summary> /// 實例化一個新的驗證對象 /// </summary> /// <param name="ignore">是否忽略檢查</param> public AuthRightAttribute(bool ignore = false) : base(ignore) { } /// <summary> /// 權限驗證,繼承登陸驗證 /// </summary> /// <param name="context"></param> protected override bool OnAuthorizationing(AuthorizationContext context) { //1.判斷是否登陸成功 if (!base.OnAuthorizationing(context)) { return false; } //2.忽略權限檢查 if (GlobalConfig.IgnoreCheckRight) { return true; } //3.如果是Ajax請求則不檢查權限 if (base.ContextProvider.IsAjaxRequest && GlobalConfig.IgnoreAjaxRequestCheckRight) { return true; } //4.獲取路徑,如:/區域/控制器/動作/ string url = string.Empty; if (!string.IsNullOrEmpty(ContextProvider.Area)) { url = "/" + ContextProvider.Area; } url += string.Format("/{0}/{1}/", ContextProvider.Controller, ContextProvider.Action); //5.判斷權限 if (!ApplicationContext.HaveRight(ApplicationContext.Current.User.UserId, url)) { //無法跳轉到根目錄下 //context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { Controller = "Home", action = "Right" })); if (base.ContextProvider.IsAjaxRequest) { OutputResult("此功能未授權,請聯系管理員!", 403); } else { //TODO:未測試 指定Default的路由器下的 context.Result = new RedirectToRouteResult("Default", new RouteValueDictionary(new { Controller = "Home", action = "Right" })); } return false; } return true; } } }
[AuthLogin] 和 [AuthRight] 的區別在於 [AuthLogin]只驗證是否登錄,登錄的都可以瀏覽和操作, [AuthRight] 則要驗證權限系統是否有這個權限。
有打 [AuthRight]特性類,我們就通過WCF或者Webservice去請求"權限系統" 去查詢是否該用戶有本頁面權限,如果沒有返回False,則跳到指定的提示頁面。
上篇文章中有講到,我們的權限其實只控制到頁面,但是完全是可以讓權限控制到按鈕的。如果我們在權限系統針對功能擴展表,再擴展一張操作表,配置每個
按鈕的名稱,最後再把驗證的特性類打在控制器的方法上,這就可以講權限控制到按鈕了。就看需要有沒有達到這種程序,公司做大了,項目參與人員增多了
還是要做到這一步的。
另外,上一篇文章中也有講到,我們的權限系統其實還是2006年開發的,中間雖然完善過幾次,但是對於訪問權限系統做的並不好。中間我們還一度追求新技術
使用WCF來做的,也沒怎麽做的好。這邊重構權限系統的話,我們還是希望以簡單一點的方式,比如WebAPI來完成接口請求。
哈哈,本來覺得關於權限系統的實際應用是有很多東西可以講,但是發現其實在上一篇《權限系統》和《核心框架講解(MVC)》 都各帶到了一些。
無非就三個重點:
1,以特性類[AuthRight]的形式來做權限檢查
2,在Winner2.0的核心框架中集成權限驗證
3,權限系統的控制可精細化到按鈕
另外,雖然之前也有提到過。但是我再強調一遍,權限系統一定要有忽略權限檢查的功能(包括忽略登錄檢查)。不然開發的時候很痛苦,一來是每次調試都要登錄,
二來是開發過程中每增加一個功能還要先去線下的權限系統,添加權限。
所以Winner2.0在設計的時候都會有像:GlobalConfig.IgnoreCheckRight。這樣的通過WebConfig的可配置的檢查項。
好了,權限系統差不多就說到這裏了,有興趣一起探討Winner框架的可以加我們QQ群:261083244。或者掃描左側二維碼加群。
程序員的自我救贖---7.2:權限系統實際應用