天天看點

使用者權限管理子產品的資料庫設計

RBAC(Role-Based Access Control,基于角色的通路控制),就是使用者通過角色與權限進行關聯。簡單地說,一個使用者擁有若幹角色,每一個角色擁有若幹權限。這樣,就構造成“使用者-角色-權限”的授權模型。在這種模型中,使用者與角色之間,角色與權限之間,一般者是多對多的關系。(如下圖)

使用者權限管理子產品的資料庫設計

角色是什麼?可以了解為一定數量的權限的集合,權限的載體。例如:一個論壇系統,“超級管理者”、“版主”都是角色。版主可管理版内的文章、可管理版内的使用者等,這些是權限。要給某個使用者授予這些權限,不需要直接将權限授予使用者,可将“版主”這個角色賦予該使用者。 

當使用者的數量非常大時,要給系統每個使用者逐一授權(授角色),是件非常煩瑣的事情。這時,就需要給使用者分組,每個使用者組内有多個使用者。除了可給使用者授權外,還可以給使用者組授權。這樣一來,使用者擁有的所有權限,就是使用者個人擁有的權限與該使用者所在使用者組擁有的權限之和。(下圖為使用者組、使用者與角色三者的關聯關系)

使用者權限管理子產品的資料庫設計

在應用系統中,權限表現成什麼?對功能子產品的操作,對上傳檔案的删改,菜單的通路,甚至頁面上某個按鈕、某個圖檔的可見性控制,都可屬于權限的範疇。有些權限設計,會把功能操作作為一類,而把檔案、菜單、頁面元素等作為另一類,這樣構成“使用者-角色-權限-資源”的授權模型。而在做資料表模組化時,可把功能操作和資源統一管理,也就是都直接與權限表進行關聯,這樣可能更具便捷性和易擴充性。(見下圖)

使用者權限管理子產品的資料庫設計

請留意權限表中有一列“權限類型”,我們根據它的取值來區分是哪一類權限,如“MENU”表示菜單的通路權限、“OPERATION”表示功能子產品的操作權限、“FILE”表示檔案的修改權限、“ELEMENT”表示頁面元素的可見性控制等。

這樣設計的好處有二。其一,不需要區分哪些是權限操作,哪些是資源,(實際上,有時候也不好區分,如菜單,把它了解為資源呢還是功能子產品權限呢?)。其二,友善擴充,當系統要對新的東西進行權限控制時,我隻需要建立一個新的關聯表“權限XX關聯表”,并确定這類權限的權限類型字元串。

這裡要注意的是,權限表與權限菜單關聯表、權限菜單關聯表與菜單表都是一對一的關系。(檔案、頁面權限點、功能操作等同理)。也就是每添加一個菜單,就得同時往這三個表中各插入一條記錄。這樣,可以不需要權限菜單關聯表,讓權限表與菜單表直接關聯,此時,須在權限表中新增一列用來儲存菜單的ID,權限表通過“權限類型”和這個ID來區分是種類型下的哪條記錄。

到這裡,RBAC權限模型的擴充模型的完整設計圖如下:

使用者權限管理子產品的資料庫設計

随着系統的日益龐大,為了友善管理,可引入角色組對角色進行分類管理,跟使用者組不同,角色組不參與授權。例如:某電網系統的權限管理子產品中,角色就是挂在區局下,而區局在這裡可當作角色組,它不參于權限配置設定。另外,為友善上面各主表自身的管理與查找,可采用樹型結構,如菜單樹、功能樹等,當然這些可不需要參于權限配置設定。