好久沒有寫博客了, 最近研究了一下權限方面的資料,和大家分享一下基於組織角色的權限設計思路。
一、 目標:
- 可以對功能進行權限控制,控制粒度可以達到頁面級別和控件級別
- 可以對數據進行權限控制
- 可以按角色、按人、按部門、按崗位等授權,
- 可以分級授權,方便管理
二、 設計思路

1. 模塊
模塊是一個抽象的概念,大到可以表示一個系統,小到可以表示一個控件的功能,包括了菜單、模塊、頁面、功能、數據權限及數據權限表達式等。
1) 菜單:是一個指向某個功能的指針,指向一個頁面或者功能,所以可以將其視為一個功能。
2) 模塊:頁面功能的分類,模塊下面擁在子模塊和頁面。
3) 頁面:呈現給最終用戶的界面,用戶通過頁面來和系統交互,根據系統的不同,BS架構時是web頁面, CS架構時是windows界面。
4) 控件功能:每個界面上的控件,例如保存、刪除等按鈕所代表的功能,某個控件的顯示功能等
5) 數據權限: 標識一個需要進行權限控制的數據集合,下面包含多個權限表達式,每一個表達式就是一個SQL語句的where條件的一部分。例如查看全部的表達式是 1= 1, 查看本部門的數據的表達式是 DepartmentId = ‘$User.DepartId$’、查看我的數據的表達式是UserId = ‘$User.UserId$’。
6) 權限表達式:用來對數據進行過濾,本質上是一個SQL語句的where條件的一部分。每個表達式都擁有優先級,當同時擁有多個表達式時,取優先級高的表達式。
2. 角色
角色是一組功能的集合,一個角色包含了多個功能權限,方便管理員進行授權,例如系統管理員擁有后台管理的功能,后台管理的功能包括相關菜單的權限、相關界面及控件的操作權限。
3. 組織
組織分為公司、部門、崗位和人員4級,其中公司和部門可以自循環,公司下面可以有子公司, 部門下面可以有子部門。
授權時,將角色分配給組織上的節點,可以將角色分配給公司、部門、崗位和人員,下級節點自動繼承上級組織的權限, 給某個部門分配角色后, 該部門下面的子部門和相關人員就都具有了該角色所擁有的權限。當某個人歸屬到組織上后,就自動擁有組織的權限。在分配權限時,采用權限遞增的原則進行分配。
4. 分級授權
分級授權時,只能分配那些分配給組織的權限,這個和組織所擁有的權限是不同的, 例如某個組織節點擁有10項權限, 但是可以分配的權限可能只是這10個中的一部分。
5. 相關問題
1) 用戶和組織中的人員是什么關系?
人員是用戶與組織的關系的表示, 如果一個人只有一個崗位,那么在組織中就會有一個人員。如果用戶在組織中有多個崗位,即一人多崗的情況,那么在組織中就會有多個人員。
2) 授權時,為什么不直接把模塊分配給組織,而要先把模塊分配給角色,再把角色分配給組織?
因為模塊中的功能粒度過細,用戶的管理員分不清楚每一個模塊具體有什么功能,但用戶知道角色代表的意義。例如用戶的管理員知道會計角色,但是不知道會計具體使用哪些功能。
這樣角色和組織中的崗位會有一定的重疊,但是兩者又有一些區別。組織中的崗位是用戶在實際生活中的角色, 而系統中的角色是為了方便權限管理而設置的,即權限角色。實際生活中的角色可能擁有多個權限角色。例如總經理可能擁有全部的權限角色,而在組織中總經理是一個崗位。
三、庫表設計
相關表以CM_開頭( Common的簡寫)
| 序號 |
表名 |
說明 |
| 1 |
CM_User |
用戶 |
| 2 |
CM_Org |
組織 |
| 3 |
CM_OrgRole |
組織角色 |
| 4 |
CM_Role |
角色 |
| 5 |
CM_RoleModule |
角色功能 |
| 6 |
CM_Module |
功能 |
| 7 |
CM_OrgManModule |
組織管理的功能(分級授權用) |
庫表關系圖:

四、后續思考
1、系統應該基於角色的權限控制。
2、角色有層級關系,其作用主要用於角色管理,而不是權限繼承。
3、組織代表了角色,當組織存在的時候,可以讓程序自動為每個組織中的節點建立一個角色,以避免組織與角色的重疊。
4、人員與組織是多對多關系,應該要建立一個組織人員表,而不是將人員也歸到組織表中去。
5、為了方便授權,應該有以下幾個功能:按功能授權,按角色授權(包括按人授權)
6、有組織的按組織授權,沒有組織的按角色授權
