最近工作的權限設計的角色的ER Model設計如下。
這邊僅討論角色(Role)部份,不討論權限(Permission)及使用者群組(User Group)。
在系統權限設計中,角色通常用來綁定各種權限,使用者再透過設定角色來獲取對應的權限。
例如業務主管的角色,可能綁定新增訂單、刪除訂單、覆核訂單的權限。若使用者老王是業務主管,則系統要將使用者〔老王〕與角色〔業務主管〕建立關聯。
下面的設計為一個角色可由多個角色組合而成,由多個角色組成的角色稱為〔複合角色〕。複合角色本身也是角色。
而有些角色不能與另一角色成為複合角色,例如業務與採購,因為通常業務不允許知道公司產品的成本,則採購對業務來說就是〔互斥角色〕。
無複合的角色為〔單一角色〕。任何角色的基本資料(e.g. 角色名稱)皆維護在ROLE
資料表。角色的複合關係透過COMPOUND_ROLE
資料表管理。角色的互斥關係透過EXCLUSIVE_ROLE
資料表管理。
若採購是業務的互斥角色,則業務是否同時為採購的互斥角色呢?這就要看業務需求,但我認為業務也應該把採購設為互斥。也就是當B為A的互斥,則代表A也為B的互斥。
單一角色不可與其互斥角色複合,換句話說複合角色中的單一角色彼此不互斥。例如有三個單一角色A、B、C。B為A的互斥角色,則A不可與B複合,B也不可與A複合﹔若C與A、B不互斥,C與B複合為D,D是否能再與A複合呢?當D要新增一個單一角色前,要檢查是否與既有的角色互斥。A與B互斥,而D中有了C、B,則D不能加入A。
ROLE
+----+------+
| ID | NAME |
+----+------+
| 1 | A |
+----+------+
| 2 | B |
+----+------+
| 3 | C |
+----+------+
| 4 | D |
+----+------+
EXCLUSIVE_ROLE
+----+---------+--------------+
| ID | ROLE_ID | EXCL_ROLE_ID |
+----+---------+--------------+
| 1 | 1 | 2 |
+----+---------+--------------+
| 2 | 2 | 1 |
+----+---------+--------------+
COMPOUND_ROLE
+----+---------+-------------+
| ID | ROLE_ID | SUB_ROLE_ID |
+----+---------+-------------+
| 1 | 4 | 2 |
+----+---------+-------------+
| 2 | 4 | 3 |
+----+---------+-------------+
複合角色設計上是否可以再與另一角色複合為另一個複合角色?若允許則邏輯會很複雜,在複合前要檢查複合角色中的角色是否已包含目前要被複合的角色,以Oracle來說會用到階層式查詢;若不允許則設計邏輯上比較容易,因為複合時的角色都必為單一角色。
若B為A的互斥角色,且F為B的互斥角色,那麼F是A的互斥角色嗎?答案應該是否定的,也就是F不因此為A的互斥角色。例如A是業務,B是採購,F是製造。採購與業務互斥,製造與採購互斥,但製造並不與業務互斥。
目前對權限角色設計沒有什麼經驗,以上敘述可能有錯誤。
沒有留言:
張貼留言