如何設計資料庫表實現完整的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日 醫院管理資訊系統分析報告 一 系統專案概述 醫院管理資訊系統是利用計算機軟硬體技術 網路通訊技術等...