如何設計資料庫表實現完整的RBAC 基於角色許可權控制

2023-01-19 10:54:07 字數 2992 閱讀 6406

如何設計資料庫表實現完整的rbac(基於角色許可權控制).txt老子忽悠孩子叫教育,孩子忽悠老子叫欺騙,互相忽悠叫代溝。▲ 男人這花花世界,我要用什麼顏色來吸引你如何設計資料庫表實現完整的rbac(基於角色許可權控制)***

2007-11-04 14:15

rbac(基於角色的許可權控制)是乙個老話題了,但是這兩天我試圖設計一套表結構實現完整的rbac時,發現存在很多困難。

我說的完整的rbac,是指支援角色樹形結構和角色分組。具體來說,應當包含如下許可權控制需求:

父級角色可以訪問甚至是修改其子級的資料,包含直接子級直到最終子級。

角色可以訪問其所在組的資料。

父級角色可以訪問其所有子級(從直接子級到最終子級)所在組的資料。

而具體到我的系統中,還應當有如下需求。

相容多種資料庫產品。只能用簡單的表,檢視,儲存過程和函式等實現。

同時相容單條資料處理和批量資料處理的需求。

且不論這些具體需求,rbac的基本表應當如下四個:

rolelist表,記錄所有的角色和角色組。

roleid: pk, 角色/組的id,全域性唯一,不區分角色和組。

rolename:角色/組的名稱。

roletype: r - 角色,g - 組

rolepermission表,記錄每乙個角色/組對每乙個物件的許可權。

permissionid: pk, 無特定意義。

role: 角色/組的id。

object: 物件的id。

permission: 許可權標識,如讀,寫,刪等。

rolerelationship表,記錄角色/組之間的關係。

relationid: pk, 無特定意義。

superiorrole: 父角色/組的id。

role:子角色,子組,成員角色,成員組的id。

relationship: 關係標識,可在如下設定集中選取乙個。

pg標識:p - 父子關係,g - 組/成員關係。

ppgg標識:在pg集上,再加三種:pp - 間接父級關係,gg - 組內組關係,cg - parentrole是組,childrole的子角色或間接子角色是其成員,或其子組(含間接子組)的成員

objectlist表,記錄所有的物件。

objectid: pk,物件id,全域性唯一。

objectname: 物件名稱。

... ...

分析上述表結構,不難發現,問題的關鍵在於從rolepermission表中讀取資料時,如何限定角色/組的範圍.

方案一如果角色和組的總量不大,比如在100以內,採用ppgg標識關係,讀取資料時是最快的。這個時候的sql只需要乙個輸入引數?roleid:

select object from rolepermission p left join rolerelationship r on = where = ?roleid or = ?roleid.

(尚未驗證sql的正確性)

但是,這個方案是以極度冗餘rolerelationship表的資料為代價的,比如有100個角色,那麼rolerelationship中將會有100 * 100 =10,000條記錄。而在每次調整角色和r角色組的時候,就要在rolerelationship中一次增加或刪除100條記錄。這個開銷是比較大的。

方案二只標識pg,查詢時接收的輸入引數為乙個完整的相關角色列表?rolelist。

select object from rolepermission where role in (?rolelist)

在系統執行時,這個?rolelist通常可以從role hierarchy cache中取到,比較方便。這個方案的主要問題有二:

1)如果?rolelist過長,使用in判斷效能會很差。

2)在有些情況下,如報表查詢和系統外查詢時,取得rolelist不太方便。

方案三隻標識pg,但使用如下三個資料庫函式來判斷角色/組之間的關係。

boolean ischild(role, parentrole) - 如role為parentrole的子,返回true。

boolean isdescendant(role, ancestorrole) - 如role為ancestorrole的子或間接子級,返回true。

boolean ismember(role, group) - 如role為group的成員或子組的成員,返回true。

boolean descendantismember(role, group) - 如role的子或間接子級為group的成員,返回true。

boolean isbelong(role, super) - 如role為super的子,間接子,成員或間接員,或者role的子(含間接子)是super的成員或子組成員,返回true。

在查詢時,也只需要接收乙個?roleid:select object from rolepemission where isbelong(?roleid, role)

如何寫出高效能的資料庫函式是實現這個方法的關鍵。

上述方法僅是理論分析,我傾向於方案二。

終於想到新的方案了。

方案四,

結合方案一和方案二,在rolerelationship中,對前兩級(也可以是**或四級)角色,儲存其所有的下級角色和組。這樣,如果以前兩級角色查詢資料,就使用方案一,如果以第**及以下的角色查詢資料,就使用方案二。

仍以100個角色為例,每個角色要儲存三個關係:一級主管角色,二級主管角色,直接主管角色,最多有300條資料。

每往角色組中加乙個角色,也需要加入三條資料:角色本身,一級主管角色,二級主管角色。

但往角色組中加乙個子組,需要加入的資料量就大一些:子組本身,子組所有角色,子組所有角色的一級主管角色和二級主管角色。如在多個子組中發現同一角色,可重複儲存,但應在表中附加說明是由哪個子組匯入的。

這樣在刪除子組時就可以有選擇性的刪除。

但重複子組的情況就比較麻煩,還有等考慮。假充有組g01,g11,g12,g21。g01包含g11和g12,g11和g12分別包含g21。

從g01中刪除g11時,如何判斷g21的去留?看來還是應當在維護時判斷應不應當刪除。

酒店管理系統設計資料庫課程設計

insert into 客戶 values 1003 李四 56465,江西 5654645 insert into 客戶 values 1004 王錢 65435,江西 5676577 insert into 客戶 values 1005 孫志 11464,江西 4234343 4 建立入住登記表...

人事管理系統課程設計 資料庫

資料庫課程設計 學院 管理科學與工程 班級 工104 指導老師 夏明長 學號 109094129 姓名 肖本勇 人事管理系統 personnel management system 日期 2012 12 31 摘要人力資源管理是企業管理中的乙個重要內容,隨著時代的進步,企業也逐漸變得龐大起來。如何管...

高校成績管理系統資料庫設計與實現

管理資訊系統 實驗報告 院系名稱 管理學院專業班級 電子商務 1002 班 學生姓名 白曉東學號 201046900713 學生姓名 薛萬里學號 201046900702 2012年 10 月 22日 醫院管理資訊系統分析報告 一 系統專案概述 醫院管理資訊系統是利用計算機軟硬體技術 網路通訊技術等...