RBAC(Role-Based Access Control,基於角色的存取控制),就是使用者透過角色與權限進行關聯。簡單地說,一個使用者擁有若干角色,每個角色擁有若干權限。這樣,就建構成「使用者-角色-權限」的授權模型。在這種模型中,使用者與角色之間,角色與權限之間,一般者是多對多的關係。 (如下圖)
角色是什麼?可以理解為一定數量的權限的集合,權限的載體。例如:一個論壇系統,「超級管理員」、「版主」都是角色。版主可管理版內的貼文、可管理版內的使用者等,這些都是權限。要給某個用戶授予這些權限,不需要直接將權限授予用戶,可將「版主」這個角色賦予該用戶。
當使用者的數量非常大時,要給系統每位使用者逐一授權(授角色),是件非常煩瑣的事情。這時,就需要給使用者分組,每個使用者群組內有多個使用者。除了可給予使用者授權外,還可以給使用者群組授權。這樣一來,使用者擁有的所有權限,就是使用者個人擁有的權限與該使用者所在使用者群組擁有的權限總和。 (下圖為使用者群組、使用者與角色三者的關聯關係)
在應用系統中,權限表現成什麼?對功能模組的操作,對上傳檔案的刪改,選單的訪問,甚至頁面上某個按鈕、某個圖片的可見性控制,都可屬於權限的範疇。有些權限設計,會把功能操作當作一類,而把檔案、選單、頁面元素等當作另一類,這樣構成「使用者-角色-權限-資源」的授權模型。而在做資料表建模時,可把功能操作和資源統一管理,也就是都直接與權限表進行關聯,這樣可能更具便利性和易擴充性。 (見下圖)
請留意權限表中有一列“權限類型”,我們根據它的取值來區分是哪一類權限,如「MENU」表示選單的存取權限、「OPERATION」表示功能模組的操作權限、「FILE」表示檔案的修改權限、「ELEMENT」表示頁面元素的可見性控制等。
這樣設計的好處有二。其一,不需要區分哪些是權限操作,哪些是資源,(實際上,有時候也不好區分,如選單,把它理解為資源呢還是功能模組權限呢?)。其二,方便擴展,當系統要對新的東西進行權限控制時,我只需要建立一個新的關聯表“權限XX關聯表”,並確定這類權限的權限類型字串# 。
這裡要注意的是,權限表與權限選單關聯表、權限選單關聯表與選單表都是一對一的關係。 (文件、頁面權限點、功能操作等同理)。也就是每新增一個選單,就得同時往這三個表中各插入一筆記錄。這樣,可以不需要權限選單關聯表,讓權限表與選單表直接關聯,此時,須在權限表中新增一列用來保存選單的ID,權限表透過“權限類型”和這個ID來區分是種類型下的哪一筆記錄。
到這裡,RBAC權限模型的擴充模型的完整設計圖如下:
隨著系統的日益龐大,為了方便管理,可引入角色群組對角色進行分類管理,跟使用者群組不同,角色群組不參與授權。例如:某電網系統的權限管理模組中,角色就是掛在區局下,而區局在這裡可當作角色組,它不參於權限分配。另外,為方便上面各主表本身的管理與查找,可採用樹形結構,如選單樹、功能樹等,當然這些可不需要參考權限分配。
以上,是從基本的RBAC模型進行了擴展,具體的設計要根據專案業務的需求進行調整。
以上是thinkphp中的RBAC使用者權限管理資料庫設計的圖文詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!