對于任何一個成熟的系統(tǒng)而言,如何設計權限體系,是我們在項目設計之初就應該考慮的座每。在筆者看來,一個完善的權限系統(tǒng)可以在保證業(yè)務邏輯正確的前提下摘悴,盡量保證代碼的簡潔性和可擴展性峭梳。
關系模型
我們需要思考如下幾個概念之間的關系:
- 用戶。
- 角色:權限的載體。一個合法用戶應該有一個或多個角色葱椭。
- 資源:系統(tǒng)的模塊捂寿,需要區(qū)分不同權限。
- 角色權限:某個角色對某個資源type具有的權限孵运。
- 內容權限:某個用戶對某個資源id的權限秦陋。
除此之外,我們還應考慮用戶是否有組的概念治笨,比如:部門驳概。我們可以把不同的組稱作域(組或許還有層級關系)或者項目組。此時旷赖,角色或者角色權限就需要掛載在組的概念下顺又。
image.png
角色-資源的權限:上圖左上角。
重點理解用戶-資源id的權限:上圖左下角等孵。
在實際設計中待榔,需要根據(jù)不同的需求進行簡化或者補充。
權限點
權限點如何定義流济?有權限就是1锐锣,沒權限就是0?那顯然是不夠的绳瘟,舉個例子:
eg:對于一個資源列表雕憔,對不同角色可以粗略的分為以下權限點:
list(查看),edit(編輯)糖声,delete(刪除)等斤彼。
實現(xiàn):權限點最好的實現(xiàn)方式枚舉類。同時蘸泻,每個枚舉類的數(shù)值型標識琉苇,采用2的n(n>=0)次冪的方式遞增,這樣的好處在于悦施,我們可以用位運算來判斷權限并扇。
例如:以上3個權限的code分別為:1,2抡诞,4穷蛹。
若此時新增一個管理的權限,那么他的權限可能是上述所有權限的并集:list | edit | delete = 7昼汗。
查詢一個角色是否有刪除權限:operation & delete == delete肴熏,其實就是判斷對應的位上是否為1。