如何設(shè)計一個完美的權(quán)限管理模塊
作者:不哼不哈
cnblogs.com/myindex/p/9116177.html
我們比較常見的就是基于角色的訪問控制,用戶通過角色與權(quán)限進行關(guān)聯(lián)。簡單地說,一個用戶擁有多個角色,一個角色擁有多個權(quán)限。這樣,就構(gòu)造成“用戶-角色-權(quán)限”的授權(quán)模型。在這種模型中,用戶與角色之間、角色與權(quán)限之間,通常都是多對多的關(guān)系。如下圖:

基于這個,得先了解角色到底是什么?我們可以理解它為一定數(shù)量的權(quán)限的集合,是一個權(quán)限的載體。
例如:一個論壇的“管理員”、“版主”,它們都是角色。但是所能做的事情是不完全一樣的,版主只能管理版內(nèi)的貼子,用戶等,而這些都是屬于權(quán)限,如果想要給某個用戶授予這些權(quán)限,不用直接將權(quán)限授予用戶,只需將“版主”這個角色賦予該用戶即可。
但是通過上面我們也發(fā)現(xiàn)問題了,如果用戶的數(shù)量非常大的時候,就需要給系統(tǒng)的每一個用戶逐一授權(quán)(分配角色),這是件非常繁瑣的事情,這時就可以增加一個用戶組,每個用戶組內(nèi)有多個用戶,除了給單個用戶授權(quán)外,還可以給用戶組授權(quán),這樣一來,通過一次授權(quán),就可以同時給多個用戶授予相同的權(quán)限,而這時用戶的所有權(quán)限就是用戶個人擁有的權(quán)限與該用戶所在組所擁有的權(quán)限之和。用戶組、用戶與角色三者的關(guān)聯(lián)關(guān)系如下圖:

通常在應(yīng)用系統(tǒng)里面的權(quán)限我們把它表現(xiàn)為菜單的訪問(頁面級)、功能模塊的操作(功能級)、文件上傳的刪改,甚至頁面上某個按鈕、圖片是否可見等等都屬于權(quán)限的范疇。有些權(quán)限設(shè)計,會把功能操作作為一類,而把文件、菜單、頁面元素等作為另一類,這樣構(gòu)成“用戶-角色-權(quán)限-資源”的授權(quán)模型。而在做數(shù)據(jù)表建模時,可把功能操作和資源統(tǒng)一管理,也就是都直接與權(quán)限表進行關(guān)聯(lián),這樣可能更具便捷性和易擴展性。如下圖:

這里特別需要注意以下權(quán)限表中有一列“PowerType(權(quán)限類型)”,我們根據(jù)它的取值來區(qū)分是哪一類權(quán)限,可以把它理解為一個枚舉,如“MENU”表示菜單的訪問權(quán)限、“OPERATION”表示功能模塊的操作權(quán)限、“FILE”表示文件的修改權(quán)限、“ELEMENT”表示頁面元素的可見性控制等。
這樣設(shè)計的好處有兩個:
一、不需要區(qū)分哪些是權(quán)限操作,哪些是資源,(實際上,有時候也不好區(qū)分,如菜單,把它理解為資源呢還是功能模塊權(quán)限呢?);
二、方便擴展,當(dāng)系統(tǒng)要對新的東西進行權(quán)限控制時,我只需要建立一個新的關(guān)聯(lián)表“權(quán)限XX關(guān)聯(lián)表”,并確定這類權(quán)限的權(quán)限類型字符串即可。
需要注意的是,權(quán)限表與權(quán)限菜單關(guān)聯(lián)表、權(quán)限菜單關(guān)聯(lián)表與菜單表都是一對一的關(guān)系。(文件、頁面權(quán)限點、功能操作等同理)。也就是每添加一個菜單,就得同時往這三個表中各插入一條記錄。
這樣,可以不需要權(quán)限菜單關(guān)聯(lián)表,讓權(quán)限表與菜單表直接關(guān)聯(lián),此時,須在權(quán)限表中新增一列用來保存菜單的ID,權(quán)限表通過“權(quán)限類型”和這個ID來區(qū)分是種類型下的哪條記錄。最后擴展出來的模型完整設(shè)計如下圖:

注意上面我額外增加了一個操作日志表;
隨著系統(tǒng)的日益龐大,為了方便管理,如果有需要可引入角色組對角色進行分類管理,跟用戶組不同,角色組不參與授權(quán)。
例如:當(dāng)遇到有多個子公司,每個子公司下有多個部門,這是我們就可以把部門理解為角色,子公司理解為角色組,角色組不參于權(quán)限分配。另外,為方便上面各主表自身的管理與查找,可采用樹型結(jié)構(gòu),如菜單樹、功能樹等,當(dāng)然這些可不需要參于權(quán)限分配。
數(shù)據(jù)字典:
1.用戶表:

2.角色表:

3.用戶與角色關(guān)聯(lián)表

4.用戶組表

5.用戶組與用戶信息關(guān)聯(lián)表

6.用戶組與角色關(guān)聯(lián)表

7.菜單表

8.頁面元素表

9.文件表

10.權(quán)限表

11.權(quán)限與菜單關(guān)聯(lián)表

12.權(quán)限與頁面元素關(guān)聯(lián)表

13.權(quán)限與文件關(guān)聯(lián)表

14.功能操作表

15.權(quán)限與功能操作關(guān)聯(lián)表

16.角色與權(quán)限關(guān)聯(lián)表

17.操作日志表
