天天看點

基于資源的權限系統-設計思路概述另一種 RBAC(resource base access control)總結

權限系統提的最多的就是 RBAC(基于角色的通路控制)。 所謂角色,其實就是權限的集合,某個角色就是某幾個權限的結合。其目的是為了簡化授權和鑒權的過程。

基于角色的權限控制用在簡單的權限環境下沒有問題,如果在權限控制比較複雜的系統中,或者說要做通用的權限系統時,基于角色的權限控制會帶來以下問題:

角色可以用來做功能權限,做資料權限的話,會導緻角色數量非常多 比如:bug管理系統,一般有 developer, reporter, manager 等一些角色,其中,reporter 可以建立bug,developer 可以解決,回複bug,manager 可以統計bug 等等。 在這個系統中,通過設定 developer,reporter,manager 幾個角色,可以使得授權,鑒權更加簡單,直覺。 但是,如果權限粒度要求更細的話,比如,某些reporter隻能建立普通級别的bug,某些reporter可以建立各個級别的bug,或者有更加細粒度的權限要求的話,角色的數量就會激增。 到時候,管理角色本身帶來的工作量反而會大于角色帶來的好處。

角色是一維的,不同的角色之間一般都是獨立的,而人員之間一般有樹狀的組織關系。是以,角色就很難與已有的組織關系互相映射。 而授權的時候,經常是上級的組織會自動擷取下級建立的資料的一些權限

對于不确定的系統來說,角色不好定義。如果是bug系統,比較成熟,友善定義角色類型,如果是通用系統的話,使用者其實不太容易定義好自己需要的角色。

基于角色的權限系統一般簡稱 RBAC,而這裡的 RBAC 是指 基于資源的權限系統。

目的是設計一種通用的權限管理系統,不和任何的實際的業務關聯,隻做權限相關的管理和驗證。 之是以以 資源 為核心,是因為上面的提到的那些基于 角色 的限制。 基于資源的權限系統是圍繞 組織樹 和 資源樹 來進行權限的。

人員 : 實際使用系統的使用者,也就是需要進行權限檢查的人

組織 : 樹形結構,但是人員可以屬于一個或者多個組織

資源 : 需要授權的東西都可以認為是資源,每個功能是資源,每個接口也是資源,每條資料也是資源。 資源樹 上的根就是整個系統。

動作 : 對資源的操作,比如常用的 建立,删除,更新,查詢

權限 : 組織 + 資源 + 動作 (什麼人對什麼資源可以做什麼動作)

權限系統本身提供一個超級使用者(admin),通過此使用者來初始化最初需要的資訊。

初始資訊隻需要定義:

組織的根節點:以後追加的所有人員群組織都在此節點之下(比如就是某個公司)

資源的根節點:以後追加的所有資源都在此節點之下(比如就是需要進行權限控制的系統)

動作:對資源可能進行的操作(一般就是CURD,增删改查)

有了以上資訊,就完成了針對某個系統群組織的權限系統的基本初始化。 基本資訊初始化之後,可以導入組織/人員,以及資源資訊,或者直接在權限系統提供的頁面上操作。

注意 每個資源隻有一個父節點,每個組織也隻有一個父組織,但是每個人員可以屬于多個組織。

授權是權限系統中重要的步驟之一,另一個重要步驟就是鑒權。 授權有2種視圖:

人員/組織 視圖 下的授權流程

選擇 資源

選擇 動作

确認授權

生成權限資料

注1 前2步的選擇都可以多選。

資源 視圖 下的授權流程

選擇 人員/組織

鑒權是使用最頻繁的步驟,幾乎每次請求都會有鑒權的操作。 鑒權就是判斷 某人對某資源做某個動作 是否合法,是以鑒權的 input 是 人員/組織,資源,動作; output 則是是否鑒權成功。

根據 input 的内容(人員/組織,資源,動作),檢視權限表中是否有比對的資料

1.1 有比對的資料,傳回鑒權成功

1.2 沒有比對的資料,查找 人員/組織 所屬的父組織,再次用 (父組織,資源,動作)作為 input,檢視權限表中是否有比對的資料

1.2.1 有比對的資料,傳回鑒權成功

1.2.2 沒有比對的資料

1.2.2.1 目前組織已經是 根組織,傳回鑒權失敗

1.2.2.2 目前組織不是 根組織,進入步驟 1.2

對功能權限來說,一般資料量不會太大,即使沒有自動授權,手動授權也可以完成。 但是對資料權限來說,不僅資料量龐大,而且如何授權也不确定,資料的變化也可能會很頻繁,手動來做幾乎不可能。

自動授權目的是将自動授權機制參數化,讓使用者通過設定不同的參數來生成不同的權限資料。 自動授權機制是以插件的形式加入到權限系統中的,預設可以提供幾種常用的自動授權機制插件。 在授權時,也可以指定使用一種或者多種自動授權插件。

下面以一個示例來說明插件是如何使用的。 示例插件:建立資料時自動授權插件 功能:使用者A 建立資料X 後,生成如下權限資料:

使用者A 可以 修改 查詢 删除 資料X

使用者A 所屬組織的成員可以 查詢 修改 資料X

其他組織的成員可以 查詢 資料X

此插件參數就是3個list:自己的動作清單,同組織成員的動作清單,其他組織人員的動作清單 插件的參數是在權限系統中的插件管理功能中配置的(插件參數的設定需要用到動态表單,因為插件的參數個數,類型等都是不定的)

使用流程如下:

某使用者建立了一條資料

建立完資料後,調用權限系統的授權接口,在授權接口中指定使用上面的 示例插件

權限系統的授權接口會調用上面的 示例插件 給使用者,使用者所屬組織以及其他組織 分别授予相應的權限

針對不同類型的系統,授權方式千差萬别,将授權的實作剝離出來,是為了增加系統的通用性。

通用權限管理的主要的功能就是 授權 和 鑒權 ,其本質都是對權限資料(什麼人對什麼資源可以做什麼動作)的管理。 授權的難點在于給某人授與某個資料的權限之後,組織中其他關聯人員可以計算出自己對這個資料的權限,這就是自動授權插件的意義。 鑒權的難點一是權限的資料量會比較大(如果權限粒度細的話),一是有些權限是需要計算的。

基于角色的權限系統的核心在 角色(人員),而基于資源的權限系統核心在 資源,資源是權限系統需要保護的東西。 希望能從資源的角度來設計出更加通用的權限管理系統。

本文轉自wang_yb部落格園部落格,原文連結:http://www.cnblogs.com/wang_yb/p/6117468.html,如需轉載請自行聯系原作者

繼續閱讀