我們比較常見(jiàn)的就是基于角色的訪問(wèn)控制,用戶通過(guò)角色與權(quán)限進(jìn)行關(guān)聯(lián)士鸥。簡(jiǎn)單地說(shuō)闲孤,一個(gè)用戶擁有多個(gè)角色,一個(gè)角色擁有多個(gè)權(quán)限烤礁。這樣讼积,就構(gòu)造成“用戶-角色-權(quán)限”的授權(quán)模型。在這種模型中脚仔,用戶與角色之間勤众、角色與權(quán)限之間,通常都是多對(duì)多的關(guān)系鲤脏。如下圖:
基于這個(gè)决摧,得先了解角色到底是什么?我們可以理解它為一定數(shù)量的權(quán)限的集合凑兰,是一個(gè)權(quán)限的載體掌桩。
例如:一個(gè)論壇的“管理員”、“版主”姑食,它們都是角色波岛。但是所能做的事情是不完全一樣的,版主只能管理版內(nèi)的貼子音半,用戶等则拷,而這些都是屬于權(quán)限,如果想要給某個(gè)用戶授予這些權(quán)限曹鸠,不用直接將權(quán)限授予用戶煌茬,只需將“版主”這個(gè)角色賦予該用戶即可。
但是通過(guò)上面我們也發(fā)現(xiàn)問(wèn)題了彻桃,如果用戶的數(shù)量非常大的時(shí)候坛善,就需要給系統(tǒng)的每一個(gè)用戶逐一授權(quán)(分配角色),這是件非常繁瑣的事情,這時(shí)就可以增加一個(gè)用戶組眠屎,每個(gè)用戶組內(nèi)有多個(gè)用戶剔交,除了給單個(gè)用戶授權(quán)外,還可以給用戶組授權(quán)改衩,這樣一來(lái)岖常,通過(guò)一次授權(quán),就可以同時(shí)給多個(gè)用戶授予相同的權(quán)限葫督,而這時(shí)用戶的所有權(quán)限就是用戶個(gè)人擁有的權(quán)限與該用戶所在組所擁有的權(quán)限之和竭鞍。用戶組、用戶與角色三者的關(guān)聯(lián)關(guān)系如下圖:
通常在應(yīng)用系統(tǒng)里面的權(quán)限我們把它表現(xiàn)為菜單的訪問(wèn)(頁(yè)面級(jí))橄镜、功能模塊的操作(功能級(jí))笼蛛、文件上傳的刪改,甚至頁(yè)面上某個(gè)按鈕蛉鹿、圖片是否可見(jiàn)等等都屬于權(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ò)展性。如下圖:
這里特別需要注意以下權(quán)限表中有一列“PowerType(權(quán)限類型)”蟀俊,我們根據(jù)它的取值來(lái)區(qū)分是哪一類權(quán)限钦铺,可以把它理解為一個(gè)枚舉,如“MENU”表示菜單的訪問(wèn)權(quán)限肢预、“OPERATION”表示功能模塊的操作權(quán)限矛洞、“FILE”表示文件的修改權(quán)限、“ELEMENT”表示頁(yè)面元素的可見(jiàn)性控制等烫映。
這樣設(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)限表中新增一列用來(lái)保存菜單的ID,權(quán)限表通過(guò)“權(quán)限類型”和這個(gè)ID來(lái)區(qū)分是種類型下的哪條記錄悼沿。最后擴(kuò)展出來(lái)的模型完整設(shè)計(jì)如下圖:
注意上面我額外增加了一個(gè)操作日志表等舔;
隨著系統(tǒng)的日益龐大,為了方便管理糟趾,如果有需要可引入角色組對(duì)角色進(jìn)行分類管理慌植,跟用戶組不同,角色組不參與授權(quán)义郑。
例如:當(dāng)遇到有多個(gè)子公司蝶柿,每個(gè)子公司下有多個(gè)部門(mén),這是我們就可以把部門(mén)理解為角色非驮,子公司理解為角色組只锭,角色組不參于權(quán)限分配。另外院尔,為方便上面各主表自身的管理與查找蜻展,可采用樹(shù)型結(jié)構(gòu),如菜單樹(shù)邀摆、功能樹(shù)等纵顾,當(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.頁(yè)面元素表
9.文件表
10.權(quán)限表
11.權(quán)限與菜單關(guān)聯(lián)表
12.權(quán)限與頁(yè)面元素關(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.操作日志表