很久沒有寫博客了, 最近研究了一下權限方面的資料,和你們分享一下基於組織角色的權限設計思路。web
1、 目標:windows
2、 設計思路 架構
1. 模塊spa
模塊是一個抽象的概念,大到能夠表示一個系統,小到能夠表示一個控件的功能,包括了菜單、模塊、頁面、功能、數據權限及數據權限表達式等。設計
1) 菜單:是一個指向某個功能的指針,指向一個頁面或者功能,因此能夠將其視爲一個功能。3d
2) 模塊:頁面功能的分類,模塊下面擁在子模塊和頁面。指針
3) 頁面:呈現給最終用戶的界面,用戶經過頁面來和系統交互,根據系統的不一樣,BS架構時是web頁面, CS架構時是windows界面。blog
4) 控件功能:每一個界面上的控件,例如保存、刪除等按鈕所表明的功能,某個控件的顯示功能等繼承
5) 數據權限: 標識一個須要進行權限控制的數據集合,下面包含多個權限表達式,每個表達式就是一個SQL語句的where條件的一部分。例如查看所有的表達式是 1= 1, 查看本部門的數據的表達式是 DepartmentId = ‘$User.DepartId$’、查看個人數據的表達式是UserId = ‘$User.UserId$’。ci
6) 權限表達式:用來對數據進行過濾,本質上是一個SQL語句的where條件的一部分。每一個表達式都擁有優先級,當同時擁有多個表達式時,取優先級高的表達式。
2. 角色
角色是一組功能的集合,一個角色包含了多個功能權限,方便管理員進行受權,例如系統管理員擁有後臺管理的功能,後臺管理的功能包括相關菜單的權限、相關界面及控件的操做權限。
3. 組織
組織分爲公司、部門、崗位和人員4級,其中公司和部門能夠自循環,公司下面能夠有子公司, 部門下面能夠有子部門。
受權時,將角色分配給組織上的節點,能夠將角色分配給公司、部門、崗位和人員,下級節點自動繼承上級組織的權限, 給某個部門分配角色後, 該部門下面的子部門和相關人員就都具備了該角色所擁有的權限。當某我的歸屬到組織上後,就自動擁有組織的權限。在分配權限時,採用權限遞增的原則進行分配。
4. 分級受權
分級受權時,只能分配那些分配給組織的權限,這個和組織所擁有的權限是不一樣的, 例如某個組織節點擁有10項權限, 可是能夠分配的權限可能只是這10箇中的一部分。
5. 相關問題
1) 用戶和組織中的人員是什麼關係?
人員是用戶與組織的關係的表示, 若是一我的只有一個崗位,那麼在組織中就會有一我的員。若是用戶在組織中有多個崗位,即一人多崗的狀況,那麼在組織中就會有多我的員。
2) 受權時,爲何不直接把模塊分配給組織,而要先把模塊分配給角色,再把角色分配給組織?
由於模塊中的功能粒度過細,用戶的管理員分不清楚每個模塊具體有什麼功能,但用戶知道角色表明的意義。例如用戶的管理員知道會計角色,可是不知道會計具體使用哪些功能。
這樣角色和組織中的崗位會有必定的重疊,可是二者又有一些區別。組織中的崗位是用戶在實際生活中的角色, 而系統中的角色是爲了方便權限管理而設置的,即權限角色。實際生活中的角色可能擁有多個權限角色。例如總經理可能擁有所有的權限角色,而在組織中總經理是一個崗位。
3、庫表設計
相關表以CM_開頭( Common的簡寫)
序號 |
表名 |
說明 |
1 |
CM_User |
用戶 |
2 |
CM_Org |
組織 |
3 |
CM_OrgRole |
組織角色 |
4 |
CM_Role |
角色 |
5 |
CM_RoleModule |
角色功能 |
6 |
CM_Module |
功能 |
7 |
CM_OrgManModule |
組織管理的功能(分級受權用) |
庫表關係圖:
4、後續思考
一、系統應該基於角色的權限控制。
二、角色有層級關係,其做用主要用於角色管理,而不是權限繼承。
三、組織表明了角色,當組織存在的時候,可讓程序自動爲每一個組織中的節點創建一個角色,以免組織與角色的重疊。
四、人員與組織是多對多關係,應該要創建一個組織人員表,而不是將人員也歸到組織表中去。
五、爲了方便受權,應該有如下幾個功能:按功能受權,按角色受權(包括按人受權)
六、有組織的按組織受權,沒有組織的按角色受權