權(quán)限系統(tǒng)設(shè)計(jì)

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

image

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

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

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

image

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

image

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

這樣設(shè)計(jì)的好處有兩個(gè):

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

二、方便擴(kuò)展,當(dāng)系統(tǒng)要對(duì)新的東西進(jìn)行權(quán)限控制時(shí),我只需要建立一個(gè)新的關(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)表與菜單表都是一對(duì)一的關(guān)系。(文件、頁(yè)面權(quán)限點(diǎn)、功能操作等同理)。也就是每添加一個(gè)菜單,就得同時(shí)往這三個(gè)表中各插入一條記錄。

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

image

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

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

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

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

1.用戶表:

image

2.角色表:

image

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

image

4.用戶組表

image

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

image

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

image

7.菜單表

image

8.頁(yè)面元素表

image

9.文件表

image

10.權(quán)限表

image

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

image

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

image

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

image

14.功能操作表

image

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

image

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

image

17.操作日志表

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容