如何設計一個完美的權限管理模塊

我們比較常見的就是基于角色的訪問控制,用戶通過角色與權限進行關聯(lián)。簡單地說,一個用戶擁有多個角色,一個角色擁有多個權限。這樣,就構造成“用戶-角色-權限”的授權模型。在這種模型中,用戶與角色之間、角色與權限之間,通常都是多對多的關系。如下圖:

image

基于這個,得先了解角色到底是什么?我們可以理解它為一定數(shù)量的權限的集合,是一個權限的載體。

例如:一個論壇的“管理員”、“版主”,它們都是角色。但是所能做的事情是不完全一樣的,版主只能管理版內(nèi)的貼子,用戶等,而這些都是屬于權限,如果想要給某個用戶授予這些權限,不用直接將權限授予用戶,只需將“版主”這個角色賦予該用戶即可。

但是通過上面我們也發(fā)現(xiàn)問題了,如果用戶的數(shù)量非常大的時候,就需要給系統(tǒng)的每一個用戶逐一授權(分配角色),這是件非常繁瑣的事情,這時就可以增加一個用戶組,每個用戶組內(nèi)有多個用戶,除了給單個用戶授權外,還可以給用戶組授權,這樣一來,通過一次授權,就可以同時給多個用戶授予相同的權限,而這時用戶的所有權限就是用戶個人擁有的權限與該用戶所在組所擁有的權限之和。用戶組、用戶與角色三者的關聯(lián)關系如下圖:

image

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

image

這里特別需要注意以下權限表中有一列“PowerType(權限類型)”,我們根據(jù)它的取值來區(qū)分是哪一類權限,可以把它理解為一個枚舉,如“MENU”表示菜單的訪問權限、“OPERATION”表示功能模塊的操作權限、“FILE”表示文件的修改權限、“ELEMENT”表示頁面元素的可見性控制等。

這樣設計的好處有兩個:

一、不需要區(qū)分哪些是權限操作,哪些是資源,(實際上,有時候也不好區(qū)分,如菜單,把它理解為資源呢還是功能模塊權限呢?);

二、方便擴展,當系統(tǒng)要對新的東西進行權限控制時,我只需要建立一個新的關聯(lián)表“權限XX關聯(lián)表”,并確定這類權限的權限類型字符串即可。

需要注意的是,權限表與權限菜單關聯(lián)表、權限菜單關聯(lián)表與菜單表都是一對一的關系。(文件、頁面權限點、功能操作等同理)。也就是每添加一個菜單,就得同時往這三個表中各插入一條記錄。

這樣,可以不需要權限菜單關聯(lián)表,讓權限表與菜單表直接關聯(lián),此時,須在權限表中新增一列用來保存菜單的ID,權限表通過“權限類型”和這個ID來區(qū)分是種類型下的哪條記錄。最后擴展出來的模型完整設計如下圖:

image

注意上面我額外增加了一個操作日志表;

隨著系統(tǒng)的日益龐大,為了方便管理,如果有需要可引入角色組對角色進行分類管理,跟用戶組不同,角色組不參與授權。

例如:當遇到有多個子公司,每個子公司下有多個部門,這是我們就可以把部門理解為角色,子公司理解為角色組,角色組不參于權限分配。另外,為方便上面各主表自身的管理與查找,可采用樹型結(jié)構,如菜單樹、功能樹等,當然這些可不需要參于權限分配。

數(shù)據(jù)字典:

1.用戶表:

image

2.角色表:

image

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

image

4.用戶組表

image

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

image

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

image

7.菜單表

image

8.頁面元素表

image

9.文件表

image

10.權限表

image

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

image

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

image

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

image

14.功能操作表

image

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

image

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

image

17.操作日志表

image
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,407評論 0 9
  • 在20世紀90年代期間,大量專家學者和研究單位對RBAC(Role-Based Access Control)的概...
    JunChow520閱讀 9,147評論 3 149
  • 我們比較常見的就是基于角色的訪問控制,用戶通過角色與權限進行關聯(lián)。簡單地說,一個用戶擁有多個角色,一個角色擁有多個...
    志_933e閱讀 23,048評論 8 20
  • 今天有開心的,也有不開心的,先講開心的 我們班有一女生,小珊,她今天看起來可精神了!明顯比以前開心多了。她以前總是...
    照進你心里的小太陽閱讀 100評論 0 0
  • 今天這一天其實過的并不是太愉快,因為工作多,因為心情不好,因為心情不好還得做一堆事,真的很累人。但是我覺得今天的自...
    晨寶要瘦瘦瘦閱讀 135評論 0 0