RBAC 權限管理設計
- 前言
- 權限分類
- 功能權限設計
- 什么是 RBAC
- RBAC 組成
- RBAC 模型分類
- 基本模型RBAC0
- 角色分層模型RBAC1
- 角色限制模型RBAC2
- 統一模型RBAC3
- RBAC0 權限設計
- 用戶管理
- 角色管理
- 權限管理
- 關聯表
- 總結
前言
作為一個后臺管理系統,權限管理是一個繞不開的話題,一個成熟的后端系統離不開一個比較完善的權限管理系統,所以本小結我們根據 RBAC 思想來設計一下我們這個系統的權限管理。
權限分類
一般來說,我們常說的權限分為兩種,一種是功能權限,一種則是數據權限。
- 功能權限指的是用戶登錄系統后能看到什么模塊,能看到哪些頁面。
- 數據權限指的是用戶在某個模塊里面能夠看到哪些數據。
本系統目前只進行功能權限的設計,數據權限默認進行管控,先最小化功能實現,后面有需求在迭代吧。
功能權限設計
目前業界有很多關于權限系統的技術模型,常見的有ACL、ABAC、DAC、RBAC等等,不同體量的權限系統,我們可以參考不同的權限模型進行梳理和設計,本系統就采用一個經典的 RBAC 權限系統模型,我接觸的系統基本上都是使用的 RBAC 模型,能滿足絕大部分的需求。
什么是 RBAC
RBAC 模型(Role-Based Access Control:基于角色的訪問控制)模型是比較早期提出的權限實現模型,在多用戶計算機時期該思想即被提出,其中以美國George Mason大學信息安全技術實驗室(LIST)提出的RBAC96模型最具有代表,并得到了普遍的公認。
RBAC 認為權限授權的過程可以抽象地概括為:Who 是否可以對What進行How的訪問操作,并對這個邏輯表達式進行判斷是否為True的求解過程,也即是將權限問題轉換為Who、What、How的問題,Who、What、How構成了訪問權限三元組,具體的理論可以參考RBAC96。
RBAC的權限授權其實就是Who、What、How的問題。
Who
:權限的擁用者What
:權限針對的資源How
:具體的權限
RBAC 組成
RBAC模型的三要素為:用戶、角色、權限。
- 用戶:是發起操作的主體,例如:后臺管理系統的用戶、OA系統的內部員工、面向C端的用戶。
- 角色:用于連接了用戶和權限的橋梁,每個角色可以關聯多個權限,同時一個用戶也可以關聯多個角色,那么這個用戶就有了多個角色的多個權限。
- 權限:用戶可以訪問的資源,包括:頁面權限、操作權限、數據權限。
RBAC 模型分類
本系統使用 RBAC0 作為權限設計的方案,夠用以及容易學習。
在RBAC中,根據權限設計的復雜程度,可分為RBAC0、RBAC1、RBAC2、RBAC3,我們就重點了解一下我們需要使用到的 RBAC0 模型就行,另外幾種有興趣可以百度一下。
基本模型RBAC0
RBAC0是基礎,很多產品只需基于RBAC0就可以搭建權限模型了。在這個模型中,我們把權限賦予角色,再把角色賦予用戶。用戶和角色,角色和權限都是多對多的關系。用戶擁有的權限等于他所有的角色持有權限之和。
角色分層模型RBAC1
RBAC1建立在RBAC0基礎之上,在角色中引入了繼承的概念。簡單理解就是,給角色可以分成幾個等級,每個等級權限不同,從而實現更細粒度的權限管理。
角色限制模型RBAC2
RBAC2同樣建立在RBAC0基礎之上,僅是對用戶、角色和權限三者之間增加了一些限制。這些限制可以分成兩類,即靜態職責分離SSD(Static Separation of Duty)和動態職責分離DSD(Dynamic Separation of Duty)。
統一模型RBAC3
RBAC3是RBAC1和RBAC2的合集,所以RBAC3既有角色分層,也包括可以增加各種限制。
RBAC0 權限設計
通過上述分析,我們可以發現,設計功能權限離不開最基本的三要素:用戶管理、角色管理以及權限管理;根據業務的不同,可能還會涉及更復雜的三要素:部門管理、職位管理、菜單管理等,當然我們使用 RBAC0 只涉及到用簡單的3要素。
用戶管理
為了便于大家理解,我們先參考一個優秀的開源框架 EL-ADMIN,給大家截點圖理解理解。
可以很清楚的看到頁面上的功能,我們的頁面完成之后應該都是差不多的,并且還有一個部門管理,我們也可以有部門管理,但是不加入權限繼承。
用戶表設計:
字段 | 類型 | 含義 |
---|---|---|
id | bigint | 主鍵ID |
username | varchar | 用戶名 |
mobile | char | 手機號 |
avatar | varchar | 頭像 |
varchar | 郵箱 | |
password | varchar | 密碼 |
status | int | 狀態 1正常 2鎖定 |
is_delete | datetime | 是否刪除 |
last_login_time | datetime | 最后登錄時間 |
create_time | datetime | 創建時間 |
create_user | varchar | 創建用戶 |
update_time | datetime | 更新時間 |
update_user | varchar | 更新用戶 |
角色管理
上面說了我們的系統暫時是沒有數據權限的實現的。
角色表設計:
字段 | 類型 | 含義 |
---|---|---|
id | bigint | 主鍵ID |
name | varchar | 角色名稱 |
remark | varchar | 備注 |
status | int | 狀態 1正常 2鎖定 |
is_delete | datetime | 是否刪除 |
create_time | datetime | 創建時間 |
create_user | varchar | 創建用戶 |
update_time | datetime | 更新時間 |
update_user | varchar | 更新用戶 |
權限管理
權限表設計:
字段 | 類型 | 含義 |
---|---|---|
id | bigint | 主鍵ID |
pid | bigint | 父菜單ID,一級菜單為0 |
name | varchar | 菜單名稱 |
url | varchar | 菜單URL |
perms | varchar | 授權(多個用逗號分隔,如:user:list,user:create) |
type | int | 類型 0:目錄 1:菜單 2:按鈕 |
icon | varchar | 菜單圖標 |
order | int | 排序 |
status | int | 狀態 |
is_delete | datetime | 是否刪除 |
create_time | datetime | 創建時間 |
create_user | varchar | 創建用戶 |
update_time | datetime | 更新時間 |
update_user | varchar | 更新用戶 |
關聯表
還有兩張關聯表需要設計,這兩張表非常的簡單,只有兩個字段,分別是兩個關聯表的id,并且這兩個字段都需要設置外鍵。
用戶角色關聯表
字段 | 類型 | 含義 |
---|---|---|
user_id | bigint | 用戶ID(需要設置外鍵) |
role_id | bigint | 角色ID(需要設置外鍵) |
角色權限關聯表
字段 | 類型 | 含義 |
---|---|---|
role_id | bigint | 角色ID(需要設置外鍵) |
menu_id | bigint | 權限ID(需要設置外鍵) |
ok,關于表的設計到這里就結束了,先簡單的定了一個基礎版本,后續根據開發需求慢慢的在維護修改吧。
總結
關于權限設計這一塊,我們采用了 RBAC0 模型來實現,基本上中小型企業都是夠用的了。而且簡單易上手,學習難度不大,非常適合我們學習,下一小節我們使用 Spring Security 來編寫具體的代碼實現登錄和授權功能。