1. 程式人生 > >程序員的自我救贖---7.2:權限系統實際應用

程序員的自我救贖---7.2:權限系統實際應用

登陸 這一 sso 控制系統 分享 實際應用 auth 加權 oba

《前言》

(一) 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:權限系統實際應用