1. 程式人生 > >大型入口網站的RBAC使用者許可權管理設計

大型入口網站的RBAC使用者許可權管理設計

這是我在網上找的一些設計比較好的RBAC許可權管理

不知道,像新浪、搜狐、網易、百度、阿里巴巴、淘寶網的RBAC使用者許可權這一塊,都是這種細顆粒的RBAC設計開發,還是把他們像使用者組、角色組、許可權組、操作組、資源組的表盒資料等都封裝成工具類,持久化曾通過一個數據庫檢視View或者聯合查詢,將細顆粒的設計轉化成粗顆粒的操作。開發人員不需要關注這些比較細的東西,只需要關注粗顆粒,比如說:使用者和角色以及選單和操作就可以了。其他的什麼按鈕的曾、刪、改、差、分頁、檔案是否能上傳的許可權操作,都陪封裝的這些操作的實體工具類裡面了!!!



RBAC許可權管理 

擴充套件accessmenufile


RBAC(Role-Based Access Control,基於角色的訪問控制),就是使用者通過角色與許可權進行關聯。簡單地說,一個使用者擁有若干角色,每一個角色擁有若干許可權。這樣,就構造成“使用者-角色-許可權”的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。(如下圖)




角色是什麼?可以理解為一定數量的許可權的集合,許可權的載體。例如:一個論壇系統,“超級管理員”、“版主”都是角色。版主可管理版內的帖子、可管理版內的使用者等,這些是許可權。要給某個使用者授予這些許可權,不需要直接將許可權授予使用者,可將“版主”這個角色賦予該使用者。 

當用戶的數量非常大時,要給系統每個使用者逐一授權(授角色),是件非常煩瑣的事情。這時,就需要給使用者分組,每個使用者組內有多個使用者。除了可給使用者授權外,還可以給使用者組授權。這樣一來,使用者擁有的所有許可權,就是使用者個人擁有的許可權與該使用者所在使用者組擁有的許可權之和。(下圖為使用者組、使用者與角色三者的關聯關係)



在應用系統中,許可權表現成什麼?對功能模組的操作,對上傳檔案的刪改,選單的訪問,甚至頁面上某個按鈕、某個圖片的可見性控制,都可屬於許可權的範疇。有些許可權設計,會把功能操作作為一類,而把檔案、選單、頁面元素等作為另一類,這樣構成“使用者-角色-許可權-資源”的授權模型。而在做資料表建模時,可把功能操作和資源統一管理,也就是都直接與許可權表進行關聯,這樣可能更具便捷性和易擴充套件性。(見下圖)




請留意許可權表中有一列“許可權型別”,我們根據它的取值來區分是哪一類許可權,如“MENU”表示選單的訪問許可權、“OPERATION”表示功能模組的操作許可權、“FILE”表示檔案的修改許可權、“ELEMENT”表示頁面元素的可見性控制等。

這樣設計的好處有二。其一,不需要區分哪些是許可權操作,哪些是資源,(實際上,有時候也不好區分,如選單,把它理解為資源呢還是功能模組許可權呢?)。其二,方便擴充套件,當系統要對新的東西進行許可權控制時,我只需要建立一個新的關聯表“許可權XX關聯表”,並確定這類許可權的許可權型別字串。

這裡要注意的是,許可權表與許可權選單關聯表、許可權選單關聯表與選單表都是一對一的關係。(檔案、頁面許可權點、功能操作等同理)。也就是每新增一個選單,就得同時往這三個表中各插入一條記錄。這樣,可以不需要許可權選單關聯表,讓許可權表與選單表直接關聯,此時,須在許可權表中新增一列用來儲存選單的ID,許可權表通過“許可權型別”和這個ID來區分是種類型下的哪條記錄。


到這裡,RBAC許可權模型的擴充套件模型的完整設計圖如下:



隨著系統的日益龐大,為了方便管理,可引入角色組對角色進行分類管理,跟使用者組不同,角色組不參與授權。例如:某電網系統的許可權管理模組中,角色就是掛在區局下,而區局在這裡可當作角色組,它不參於許可權分配。另外,為方便上面各主表自身的管理與查詢,可採用樹型結構,如選單樹、功能樹等,當然這些可不需要參於許可權分配。

另外一個不同的RBAC使用者許可權管理的設計:


基於RBAC的許可權設計模型 

許可權分析文件 

基於RBAC的許可權設計模型: 

1        RBAC 介紹 

RBAC 模型作為目前最為廣泛接受的許可權模型。 

NIST (The National Institute of Standards and Technology,美國國家標準與技術研究院)標準RBAC模型由4個部件模型組成,這4個部件模型分別是基本模型RBAC0(Core RBAC)、角色分級模型RBAC1(Hierarchal RBAC)、角色限制模型RBAC2(Constraint RBAC)和統一模型RBAC3(Combines RBAC)[1]。RBAC0模型如圖1所示。 



圖表 1 RBAC 0 模型 

         RBAC0 定義了能構成一個RBAC控制系統的最小的元素集合 

在RBAC之中,包含使用者users(USERS)、角色roles(ROLES)、目標objects(OBS)、操作operations(OPS)、許可權permissions(PRMS)五個基本資料元素,許可權被賦予角色,而不是使用者,當一個角色被指定給一個使用者時,此使用者就擁有了該角色所包含的許可權。會話sessions是使用者與啟用的角色集合之間的對映。RBAC0與傳統訪問控制的差別在於增加一層間接性帶來了靈活性,RBAC1、RBAC2、RBAC3都是先後在RBAC0上的擴充套件。 

          RBAC1 引入角色間的繼承關係 

角色間的繼承關係可分為一般繼承關係和受限繼承關係。一般繼承關係僅要求角色繼承關係是一個絕對偏序關係,允許角色間的多繼承。而受限繼承關係則進一步要求角色繼承關係是一個樹結構。 

          RBAC2 模型中添加了責任分離關係 

RBAC2 的約束規定了許可權被賦予角色時,或角色被賦予使用者時,以及當用戶在某一時刻啟用一個角色時所應遵循的強制性規則。責任分離包括靜態責任分離和動態責任分離。約束與使用者-角色-許可權關係一起決定了RBAC2模型中使用者的訪問許可。 

          RBAC3 包含了RBAC1和RBAC2 

既提供了角色間的繼承關係,又提供了責任分離關係。 

建立角色定義表。定出當前系統中角色。 

因為有繼承的問題,所以角色體現出的是一個樹形結構。 



2        許可權設計: 

配置資源以及資源的操作 : 這裡資源可以定義為一個通用的資源模型。提供通用的資源統一介面。 

資料庫 ER 圖: 



關係圖: 





3        分析: 

根據以上的類關係圖和ER圖可以看出。整個許可權可以抽象為五個物件組成。 

OrgBean : 用於描述org模型。 

Role : 用於描述角色。 

Permission : 用於描述許可權。 

Resource : 用於描述資源。 

Operation : 用於描述操作。 

其中Permission中有Resource , Operation 的聚合,資源和操作組成許可權。 

Role 和 Permission 都有自包含。因為設計到許可權的繼承。 

資源Resource 也可能出現一顆樹形結構,那資源也要有自包含。 

思想 : 

許可權系統的核心由以下三部分構成: 1. 創造許可權, 2. 分配許可權, 3. 使用許可權,然後,系統各部分的主要參與者對照如下: 1. 創造許可權 - Creator 創造, 2. 分配許可權 - Administrator 分配, 3. 使用許可權 - User : 

1. Creator 創造 Privilege , Creator 在設計和實現系統時會劃分,一個子系統或稱為模組,應該有哪些許可權。這裡完成的是 Privilege 與 Resource 的物件宣告,並沒有真正將 Privilege 與具體 Resource 例項聯絡在一起,形成 Operator 。 

2. Administrator 指定 Privilege 與 Resource Instance 的關聯 。在這一步, 許可權真正與資源例項聯絡到了一起, 產生了 Operator ( Privilege Instance )。 Administrator 利用 Operator 這個基本元素,來創造他理想中的許可權模型。如,建立角色,建立使用者組,給使用者組分配使用者,將使用者組與角色關聯等等 ... 這些操作都是由 Administrator 來完成的。 

3. User 使用 Administrator 分配給的許可權去使用各個子系統。 Administrator 是使用者,在他的心目中有一個比較適合他管理和維護的許可權模型。於是,程式設計師只要回答一個問題,就是什麼許可權可以訪問什麼資源,也就是前面說的 Operator 。程式設計師提供 Operator 就意味著給系統穿上了盔甲。 Administrator 就可以按照他的意願來建立他所希望的許可權框架 可以自行增加,刪除,管理 Resource 和 Privilege 之間關係。可以自行設定使用者 User 和角色 Role 的對應關係。 ( 如果將 Creator 看作是 Basic 的發明者, Administrator 就是 Basic 的使用者,他可以做一些指令碼式的程式設計 ) Operator 是這個系統中最關鍵的部分,它是一個紐帶,一個系在 Programmer , Administrator , User 之間的紐帶。 

4        許可權API 

   getPermissionByOrgGuid(String orgGuid ) 

      通過傳入一個org的Guid , 拿到當前這個org物件都具有那些訪問許可權。 

 getSourcePermissionByOrgGuid(String orgGuid , String resouceGuid) 

    通過傳入一個org的Guid 和 一個資源的Guid , 返回改Org對當前這個資源的訪問許可權。 

getPermissionByResourceGuid(String resource) 

    通過傳入一個資源的Guid , 得到當前資源下都有那些許可權定義。 

havingHeritPermission(String orgGuid , String resouceGuid) : Boolean 

    傳入一個orgGuid, 資源GUID ,檢視改OrgGuid下對資源是否有向下繼承的許可權。這裡繼承是資源的繼承。即對父欄目有許可權,可以繼承下去對父欄目下的子欄目同樣有許可權。 

havingPermission(String orgGuid , String resourceGuid) : Boolean 

    判斷某Org對某一資源是否用許可權。 

以上是粗粒度的許可權API 。 以下為細粒度的許可權: 

getOperationByPermission(String permissionGuid) 

    通過permission 的Guid 得到該permission 的所有有效操作。 

getOperationByGuid(String permissionGuid , String resourceGuid) 

    通過permision的Guid , 資源的Guid 得到該資源下所有的有效操作。 

screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid) 

    通過permission , resource , org的Guid 得到改Org對這一資源的有效操作。 

hasOperation(String operationGuid) : boolean 

    通過傳入的operationGuid 返回是否具有操作許可權。 

5        許可權的實現: 

1 .表單式認證,這是常用的,但使用者到達一個不被授權訪問的資源時, Web 容器就發 

出一個 html 頁面,要求輸入使用者名稱和密碼。 

2 .用 Filter 防止使用者訪問一些未被授權的資源, Filter 會擷取所有 Request/Response , 

然後放置一個驗證通過的標識在使用者的 Session 中,然後 Filter 每次依靠這個標識來決定是否放行 Response 。 

這個模式分為: 

Gatekeeper :採取 Filter 或統一 Servlet 的方式。 

Authenticator : 在 Web 中使用 JAAS 自己來實現。 

Filter 攔截只是攔截該使用者是否有訪問這個頁面,或這一資源的許可權。真正做到顯示後攔截是在應用程式內部去做。 

做顯示攔截提供API , 標籤這兩種方式。