歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 基於資源的權限系統-設計思路

基於資源的權限系統-設計思路

日期:2017/3/1 9:08:13   编辑:Linux編程

概述

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

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

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

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

  3. 對於不確定的系統來說,角色不好定義。如果是bug系統,比較成熟,方便定義角色類型,如果是通用系統的話,用戶其實不太容易定義好自己需要的角色。

另一種 RBAC(resource base access control)

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

設計思路

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

術語介紹

  • 人員 : 實際使用系統的用戶,也就是需要進行權限檢查的人
  • 組織 : 樹形結構,但是人員可以屬於一個或者多個組織
  • 資源 : 需要授權的東西都可以認為是資源,每個功能是資源,每個接口也是資源,每條數據也是資源。 資源樹 上的根就是整個系統。
  • 動作 : 對資源的操作,比如常用的 創建,刪除,更新,查詢
  • 權限 : 組織 + 資源 + 動作 (什麼人對什麼資源可以做什麼動作)

系統初始化

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

初始信息只需要定義:

  • 組織的根節點:以後追加的所有人員和組織都在此節點之下(比如就是某個公司)
  • 資源的根節點:以後追加的所有資源都在此節點之下(比如就是需要進行權限控制的系統)
  • 動作:對資源可能進行的操作(一般就是CURD,增刪改查)

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

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

授權過程

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

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

    1. 選擇 資源
    2. 選擇 動作
    3. 確認授權
    4. 生成權限數據

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

  2. 資源 視圖 下的授權流程

    1. 選擇 人員/組織
    2. 選擇 動作
    3. 確認授權
    4. 生成權限數據

鑒權過程

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

    1. 根據 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:自己的動作列表,同組織成員的動作列表,其他組織人員的動作列表 插件的參數是在權限系統中的插件管理功能中配置的(插件參數的設置需要用到動態表單,因為插件的參數個數,類型等都是不定的)

使用流程如下:

  1. 某用戶創建了一條數據
  2. 創建完數據後,調用權限系統的授權接口,在授權接口中指定使用上面的 示例插件
  3. 權限系統的授權接口會調用上面的 示例插件 給用戶,用戶所屬組織以及其他組織 分別授予相應的權限

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

總結

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

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

Copyright © Linux教程網 All Rights Reserved