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

作 者:不哼不哈
cnblogs.com/myindex/p/9116177.html

我們比較常見的就是基于角色的訪問控制,用戶通過角色與權限進行關聯。簡單地說,一個用戶擁有多個角色,一個角色擁有多個權限。

這樣,就構造成“用戶-角色-權限”的授權模型。在這種模型中,用戶與角色之間、角色與權限之間,通常都是多對多的關系。如下圖:

image

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

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

但是通過上面我們也發現問題了,如果用戶的數量非常大的時候,就需要給系統的每一個用戶逐一授權(分配角色),這是件非常繁瑣的事情,這時就可以增加一個用戶組,每個用戶組內有多個用戶,除了給單個用戶授權外,還可以給用戶組授權。

這樣一來,通過一次授權,就可以同時給多個用戶授予相同的權限,而這時用戶的所有權限就是用戶個人擁有的權限與該用戶所在組所擁有的權限之和。用戶組、用戶與角色三者的關聯關系如下圖:

image

通常在應用系統里面的權限我們把它表現為菜單的訪問(頁面級)、功能模塊的操作(功能級)、文件上傳的刪改,甚至頁面上某個按鈕、圖片是否可見等等都屬于權限的范疇。

有些權限設計,會把功能操作作為一類,而把文件、菜單、頁面元素等作為另一類,這樣構成“用戶-角色-權限-資源”的授權模型。

在做數據表建模時,可把功能操作和資源統一管理,也就是都直接與權限表進行關聯,這樣可能更具便捷性和易擴展性。如下圖:

image

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

這樣設計的好處有兩個:

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

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

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

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

image

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

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

例如:當遇到有多個子公司,每個子公司下有多個部門,這是我們就可以把部門理解為角色,子公司理解為角色組,角色組不參于權限分配。

另外,為方便上面各主表自身的管理與查找,可采用樹型結構,如菜單樹、功能樹等,當然這些可不需要參于權限分配。

數據字典:

1.用戶表:

image

2.角色表:

image

3.用戶與角色關聯表

image

4.用戶組表

image

5.用戶組與用戶信息關聯表

image

6.用戶組與角色關聯表

image

7.菜單表

image

8.頁面元素表

image

9.文件表

image

10.權限表

image

11.權限與菜單關聯表

image

12.權限與頁面元素關聯表

image

13.權限與文件關聯表

image

14.功能操作表

image

15.權限與功能操作關聯表

image

16.角色與權限關聯表

image

17.操作日志表

image
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內容