基于RBAC的分權(quán)分域用戶權(quán)限系統(tǒng)數(shù)據(jù)庫設(shè)計(jì)

引子


最近要開發(fā)一個(gè)新的系統(tǒng),系統(tǒng)里面可以有許多不同的社區(qū)奈泪,每個(gè)社區(qū)下面有不同的項(xiàng)目适贸。項(xiàng)目和項(xiàng)目、社區(qū)和社區(qū)之間都是相互獨(dú)立的涝桅。我所做的工作是設(shè)計(jì)一套權(quán)限管理系統(tǒng)拜姿,這套系統(tǒng)允許不同的用戶在不同的社區(qū)或者項(xiàng)目之中有不同的權(quán)限,可以保證用戶無法做出越權(quán)的操作苹支。

經(jīng)過了一番努力,設(shè)計(jì)出了一套基于RBAC的分權(quán)分域的用戶權(quán)限系統(tǒng)误阻。

首先介紹一下什么是RBAC:

以角色為基礎(chǔ)的訪問控制(英語:Role-based access control, RBAC)债蜜,是資訊安全領(lǐng)域中,一種較新且廣為使用的訪問控制機(jī)制究反,其不同于強(qiáng)制訪問控制以及自由選定訪問控制直接賦予使用者權(quán)限寻定,而是將權(quán)限賦予角色。1996年精耐,萊威·桑度(Ravi Sandhu)等人在前人的理論基礎(chǔ)上狼速,提出以角色為基礎(chǔ)的訪問控制模型,故該模型又被稱為RBAC96卦停。之后向胡,美國國家標(biāo)準(zhǔn)局重新定義了以角色為基礎(chǔ)的訪問控制模型,并將之納為一種標(biāo)準(zhǔn)惊完,稱之為NIST RBAC僵芹。
以角色為基礎(chǔ)的訪問控制模型是一套較強(qiáng)制訪問控制以及自由選定訪問控制更為中性且更具靈活性的訪問控制技術(shù)。

在一個(gè)組織中小槐,會(huì)因?yàn)椴煌淖鳂I(yè)功能產(chǎn)生不同的角色拇派,執(zhí)行某項(xiàng)操作的權(quán)限會(huì)被賦予特定的角色。組織成員或者工作人員(抑或其它系統(tǒng)用戶)則被賦予不同的角色,這些用戶通過被賦予角色來取得執(zhí)行某項(xiàng)計(jì)算機(jī)系統(tǒng)功能的權(quán)限件豌。

  • S = 主體 = 一名使用者或自動(dòng)代理人
  • R = 角色 = 被定義為一個(gè)授權(quán)等級(jí)的工作職位或職稱
  • P = 權(quán)限 = 一種存取資源的方式
  • SE = 會(huì)期 = S疮方,R或P之間的映射關(guān)系
  • SA = 主體指派
  • PA = 權(quán)限指派
  • RH = 角色階層。能被表示為:≥(x ≥ y 代表 x 繼承 y 的權(quán)限)
  • 一個(gè)主體可對(duì)應(yīng)多個(gè)角色茧彤。
  • 一個(gè)角色可對(duì)應(yīng)多個(gè)主體骡显。
  • 一個(gè)角色可擁有多個(gè)權(quán)限。
  • 一種權(quán)限可被分配給許多個(gè)角色棘街。
  • 一個(gè)角色可以有專屬于自己的權(quán)限蟆盐。

數(shù)據(jù)庫結(jié)構(gòu)設(shè)計(jì)


項(xiàng)目使用的mysql數(shù)據(jù)庫,設(shè)計(jì)表格的大體結(jié)構(gòu)如下:

分權(quán)分域數(shù)據(jù)庫設(shè)計(jì).png

藍(lán)底模塊為基本表遭殉,黃底模塊為關(guān)系表石挂。

基本表有

  • t_user
  • t_role
  • t_permission
  • t_operation

關(guān)系表有

  • t_user_role_community
  • t_user_role_project
  • t_role_permission
  • t_permission_operation

權(quán)限判斷的主要思路是根據(jù)用戶傳過來的社區(qū)ID/項(xiàng)目ID+用戶ID+發(fā)起的請(qǐng)求路徑,通過多表聯(lián)查险污,來確定用戶在對(duì)應(yīng)的社區(qū)/項(xiàng)目內(nèi)所對(duì)應(yīng)的角色是否具有權(quán)限執(zhí)行響應(yīng)請(qǐng)求的操作痹愚。

由于在域方面,有社區(qū)和項(xiàng)目兩個(gè)尺度蛔糯,其中社區(qū)包含項(xiàng)目拯腮。但是由于一些其他原因,在社區(qū)表中無法表示出與項(xiàng)目的從屬關(guān)系蚁飒,只能把t_user_role表復(fù)用动壤,分身成兩張表:t_user_role_community和t_user_role_project。

由于我們的鑒權(quán)系統(tǒng)整個(gè)流程都是一對(duì)多的關(guān)系淮逻,即一個(gè)用戶可能對(duì)應(yīng)多個(gè)角色琼懊,一個(gè)角色可能對(duì)應(yīng)多種權(quán)限,一種權(quán)限又能對(duì)應(yīng)多種操作爬早。因此哼丈,一個(gè)用戶能對(duì)應(yīng)N多種操作,同時(shí)筛严,由于中間的多重映射關(guān)系醉旦,一個(gè)用戶對(duì)某個(gè)操作可能會(huì)對(duì)應(yīng)多次。

我們采用多表聯(lián)查的方式桨啃,輸入項(xiàng)為用戶+操作(操作具體表示為request的method+url)车胡,使用如下SQL語句進(jìn)行查詢,只要查詢結(jié)果不為空照瘾,即證明用戶有相應(yīng)的操作權(quán)限:

SELECT
    *
FROM
    t_user_role_community
INNER JOIN t_role_permission
INNER JOIN t_permission_operation ON t_user_role_community.strRole = t_role_permission.strRole
AND t_role_permission.nPermission = t_permission_operation.nPermission
WHERE
    nUser = 10025
AND nCommunity = 1
AND strMethod = 'get'
AND strUrl = '/api/t_service'

這樣做實(shí)際上只查詢了社區(qū)線的權(quán)限吨拍,此外還有項(xiàng)目線的權(quán)限以及非社區(qū)非項(xiàng)目線的權(quán)限(例如個(gè)人中心、系統(tǒng)管理之類的网杆,我們把這部分的域直接設(shè)置為nCommunity=0羹饰,即項(xiàng)目編號(hào)為0)伊滋,想要覆蓋所有的域,我們相當(dāng)于要同時(shí)多表聯(lián)查三次队秩,只要其中任意一次能夠查到數(shù)據(jù)笑旺,則表明用戶有執(zhí)行該操作的權(quán)限。我們可以用UNION語句來實(shí)現(xiàn):

(SELECT
    *
FROM
    t_user_role_community
INNER JOIN t_role_permission
INNER JOIN t_permission_operation ON t_user_role_community.strRole = t_role_permission.strRole
AND t_role_permission.nPermission = t_permission_operation.nPermission
WHERE
    nUser = 10025
AND (nCommunity = 0 OR nCommunity = 0)
AND strMethod = 'get'
AND strUrl = '/api/t_service')
UNION
(SELECT
    *
FROM
    t_user_role_project
INNER JOIN t_role_permission
INNER JOIN t_permission_operation ON t_user_role_project.strRole = t_role_permission.strRole
AND t_role_permission.nPermission = t_permission_operation.nPermission
WHERE
    nUser = 10025
AND nProject = 0
AND strMethod = 'get'
AND strUrl = '/api/t_service')

好啦馍资,這就實(shí)現(xiàn)了一個(gè)相對(duì)完整的分權(quán)分域的系統(tǒng)啦~

結(jié)語


整個(gè)鑒權(quán)過程是放在后臺(tái)以中間件的形式存在的筒主。所有發(fā)送的請(qǐng)求都要經(jīng)過鑒權(quán)中間件才能繼續(xù)往后走下去。

因此鸟蟹,除了在數(shù)據(jù)庫層面進(jìn)行設(shè)計(jì)以外乌妙,還要在后臺(tái)代碼進(jìn)行一些必要性的優(yōu)化。比如說有一類操作的對(duì)應(yīng)權(quán)限是通用權(quán)限建钥,這類接口占所有接口的一半以上藤韵。因此在鑒權(quán)中間件我會(huì)先判斷一步是否為通用權(quán)限,若是則跳過接下來的鑒權(quán)熊经,直接判過泽艘;不是的話再按照既定流程繼續(xù)鑒權(quán)。

也可以在鑒權(quán)層增加日志打印镐依,把所有經(jīng)過鑒權(quán)的請(qǐng)求記錄在案匹涮,以便日后追蹤。

寫到這里突然發(fā)現(xiàn)槐壳,我這個(gè)前端然低,越做越往后了...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市务唐,隨后出現(xiàn)的幾起案子雳攘,更是在濱河造成了極大的恐慌,老刑警劉巖绍哎,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件来农,死亡現(xiàn)場(chǎng)離奇詭異鞋真,居然都是意外死亡崇堰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門涩咖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來海诲,“玉大人,你說我怎么就攤上這事檩互√蒯#” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵闸昨,是天一觀的道長蚯斯。 經(jīng)常有香客問我薄风,道長,這世上最難降的妖魔是什么拍嵌? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任遭赂,我火速辦了婚禮,結(jié)果婚禮上横辆,老公的妹妹穿的比我還像新娘撇他。我一直安慰自己,他們只是感情好狈蚤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布困肩。 她就那樣靜靜地躺著,像睡著了一般脆侮。 火紅的嫁衣襯著肌膚如雪锌畸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天他嚷,我揣著相機(jī)與錄音蹋绽,去河邊找鬼。 笑死筋蓖,一個(gè)胖子當(dāng)著我的面吹牛卸耘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播粘咖,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蚣抗,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了瓮下?” 一聲冷哼從身側(cè)響起翰铡,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎讽坏,沒想到半個(gè)月后锭魔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡路呜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年迷捧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胀葱。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡漠秋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵屿,到底是詐尸還是另有隱情庆锦,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布轧葛,位于F島的核電站搂抒,受9級(jí)特大地震影響艇搀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜求晶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一中符、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧誉帅,春花似錦淀散、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亚再,卻和暖如春郭膛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氛悬。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工则剃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人如捅。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓棍现,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镜遣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子己肮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容