權限設計是很多系統重要的組成部分,主要用于控制功能和流程,本文將幾種常見的權限設計方案(權限系統的名都是自己起的)的基本設計寫出來,其中不恰當處還請大家指出,我們來討論一下.
1.等級權限系統
這種權限系統在論壇中很常見,在這種系統中,權限級別如同官階從低到高排列,每個用戶擁有一個權限,其中設定了這個用戶的權限等級,在用戶需要執行操作前先查看其權限等級是否大于執行操作所需要的權限等級,是則進行操作。
在等級權限系統中領域對象用戶類User的基本屬性如下:
id // 用戶ID
name // 用戶名
領域對象權限類Privilege的基本屬性如下:
id // 權限ID
userid // 持有此權限的用戶id
level // 用戶的權限等級
level的設置示例
level 對應可執行的功能
0 訪問
1 可跟帖
2 可創建主貼
3 可刪除主貼
4 可創建頻道
5 可刪除頻道
6 可查看用戶
7 可分配用戶權限
8 可修改用戶密碼
9 可刪除用戶
...
使用中,執行一個操作比如創建主貼時,先從Session中取出用戶,然后按其id查出其對應的權限等級,拿它和執行創建主貼所需要的等級(3)進行比較,高于則可進行創建主貼操作,否則報告權限不夠.
等級權限系統簡單易用,在如論壇等剛性控制系統中使用很好,但不適用于需要限制權限的范圍的場合。
2.范圍限制權限系統
等級權限系統系統的缺點是控制范圍過廣,比如一個論壇中有很多子論壇,一個子論壇的分版主同時也能對另一個同等級分論壇的帖子進行控制,這在一定程度不合理,有越界的嫌疑,更好的做法是將版主權限控制在一版之內,這時我們可以采用范圍限制權限系統. 這種權限系統在項目管理系統中很常見.
在等級權限系統中領域對象用戶類User的基本屬性如下:
id // 用戶ID
name // 用戶名
領域對象項目類Project的基本屬性如下:
id // 項目ID
name // 項目名
領域對象權限類Privilege的基本屬性如下:
id // 權限ID
userid // 持有此權限的用戶id
projectid // 此權限對應的項目
level // 用戶的權限等級
其中,通過引入了新屬性projectid,我們對權限的范圍進行了有效限制,項目不同則權限等級再高也是無效,這樣就起到了限制權限能力范圍的作用.
3.范圍限制單項權限系統
在上面兩個權限系統中,權限高的自然能執行權限要求低的操作,這樣做權力沒有細分,在有些場合并不合理,比如即使是董事長不可直接操作人事部的招聘任務,他只對雇員去留有建議權.對于這樣的場合我們需要使用范圍限制單項權限系統.它的典型應用如工作流和OA系統。
在范圍限制單項權限系統中領域對象用戶類User的基本屬性如下:
id // 用戶ID
name // 用戶名
領域對象項目類Project的基本屬性如下:
id // 項目ID
name // 項目名
領域對象權限類Privilege的基本屬性如下:
id // 權限ID
userid // 持有此權限的用戶id
projectid // 此權限對應的項目
abilityid // 權限控制能力id
領域對象權限控制能力類ability的基本屬性如下:
id // 控制能力ID
item // 控制能力子項
item的設置示例
item 對應可執行的功能
0 讀
1 寫
2 查
3 刪
...
通過對權限能力的細分,用戶權限的控制粒度更細了,對功能和流程就能有更精確的把握,適用于復雜的場合.
以上三種權限系統沒有優劣之分只有適用場合的區別,前面的粗略但易于操作,后面的精確但失之煩瑣,在現實使用中我們應該根據場合選擇合適的權限系統.