手把手教你做系統(tǒng)權(quán)限設(shè)計(jì),看完不要說還不會(huì)

權(quán)限系統(tǒng)設(shè)計(jì)

前言

權(quán)限管理是所有后臺(tái)系統(tǒng)的都會(huì)涉及的一個(gè)重要組成部分楷力,主要目的是對(duì)不同的人訪問資源進(jìn)行權(quán)限的控制,避免因權(quán)限控制缺失或操作不當(dāng)引發(fā)的風(fēng)險(xiǎn)問題邮利,如操作錯(cuò)誤弥雹,隱私數(shù)據(jù)泄露等問題垃帅。

1.權(quán)限模型

迄今為止最為普及的權(quán)限設(shè)計(jì)模型是RBAC模型,基于角色的訪問控制(Role-Based Access Control)

1.1 RBAC-0模型

RBAC-0模型

RBAC-0模型是權(quán)限最基礎(chǔ)也是最核心的模型,它包括用戶/角色/權(quán)限,其中用戶和角色是多對(duì)多的關(guān)系,角色和權(quán)限也是多對(duì)多的關(guān)系延届。

用戶 是發(fā)起操作的主體,按類型分可分為2B和2C用戶,可以是后臺(tái)管理系統(tǒng)的用戶,可以是OA系統(tǒng)的內(nèi)部員工,也可以是面向C端的用戶,比如阿里云的用戶。

角色 起到了橋梁的作用,連接了用戶和權(quán)限的關(guān)系,每個(gè)角色可以關(guān)聯(lián)多個(gè)權(quán)限,同時(shí)一個(gè)用戶關(guān)聯(lián)多個(gè)角色,那么這個(gè)用戶就有了多個(gè)角色的多個(gè)權(quán)限贸诚。

有人會(huì)問了為什么用戶不直接關(guān)聯(lián)權(quán)限呢方庭?在用戶基數(shù)小的系統(tǒng),比如20個(gè)人的小系統(tǒng),管理員可以直接把用戶和權(quán)限關(guān)聯(lián)酱固,工作量并不大械念,選擇一個(gè)用戶勾選下需要的權(quán)限就完事了。

但是在實(shí)際企業(yè)系統(tǒng)中运悲,用戶基數(shù)比較大,其中很多人的權(quán)限都是一樣的龄减,就是個(gè)普通訪問權(quán)限,如果管理員給100人甚至更多授權(quán),工作量巨大班眯。

這就引入了 "角色(Role)" 概念,一個(gè)角色可以與多個(gè)用戶關(guān)聯(lián),管理員只需要把該角色賦予用戶,那么用戶就有了該角色下的所有權(quán)限,這樣設(shè)計(jì)既提升了效率,也有很大的拓展性希停。

權(quán)限 是用戶可以訪問的資源,包括頁(yè)面權(quán)限,操作權(quán)限,數(shù)據(jù)權(quán)限:

  • 頁(yè)面權(quán)限: 即用戶登錄系統(tǒng)可以看到的頁(yè)面,由菜單來控制,菜單包括一級(jí)菜單和二級(jí)菜單,只要用戶有一級(jí)和二級(jí)菜單的權(quán)限,那么用戶就可以訪問頁(yè)面

  • 操作權(quán)限: 即頁(yè)面的功能按鈕,包括查看,新增,修改,刪除,審核等署隘,用戶點(diǎn)擊刪除按鈕時(shí)宠能,后臺(tái)會(huì)校驗(yàn)用戶角色下的所有權(quán)限是否包含該刪除權(quán)限。如果是,就可以進(jìn)行下一步操作,反之提示無權(quán)限磁餐。有的系統(tǒng)要求"可見即可操作",意思是如果頁(yè)面上能夠看到操作按鈕,那么用戶就可以操作,要實(shí)現(xiàn)此需求,這里就需要前端來配合,前端開發(fā)把用戶的權(quán)限信息緩存,在頁(yè)面判斷用戶是否包含此權(quán)限,如果有,就顯示該按鈕,如果沒有,就隱藏該按鈕违崇。某種程度上提升了用戶體驗(yàn),但是在實(shí)際場(chǎng)景可自行選擇是否需要這樣做

  • 數(shù)據(jù)權(quán)限: 數(shù)據(jù)權(quán)限就是用戶在同一頁(yè)面看到的數(shù)據(jù)是不同的,比如財(cái)務(wù)部只能看到其部門下的用戶數(shù)據(jù)诊霹,采購(gòu)部只看采購(gòu)部的數(shù)據(jù)羞延。在一些大型的公司,全國(guó)有很多城市和分公司脾还,比如杭州用戶登錄系統(tǒng)只能看到杭州的數(shù)據(jù)肴楷,上海用戶只能看到上海的數(shù)據(jù),解決方案一般是把數(shù)據(jù)和具體的組織架構(gòu)關(guān)聯(lián)起來荠呐。

    舉個(gè)例子,再給用戶授權(quán)的時(shí)候,用戶選擇某個(gè)角色同時(shí)綁定組織如財(cái)務(wù)部或者合肥分公司,那么該用戶就有了該角色下財(cái)務(wù)部或合肥分公司下的的數(shù)據(jù)權(quán)限赛蔫。

用戶砂客、角色及權(quán)限

以上是RBAC的核心設(shè)計(jì)及模型分析,此模型也叫做RBAC-0,而基于核心概念之上,RBAC還提供了擴(kuò)展模式。包括RBAC-1,RBAC-2,RBAC-3模型呵恢。下面介紹這三種類型

1.2 RBAC-1模型

image

此模型引入了角色繼承(Hierarchical Role)概念鞠值,即角色具有上下級(jí)的關(guān)系,角色間的繼承關(guān)系可分為一般繼承關(guān)系和受限繼承關(guān)系渗钉。

一般繼承關(guān)系僅要求角色繼承關(guān)系是一個(gè)絕對(duì)偏序關(guān)系彤恶,允許角色間的多繼承。

而受限繼承關(guān)系則進(jìn)一步要求角色繼承關(guān)系是一個(gè)樹結(jié)構(gòu)鳄橘,實(shí)現(xiàn)角色間的單繼承声离。這種設(shè)計(jì)可以給角色分組和分層,一定程度簡(jiǎn)化了權(quán)限管理工作瘫怜。

1.3 RBAC-2模型

基于核心模型的基礎(chǔ)上术徊,進(jìn)行了角色的約束控制,RBAC2模型中添加了責(zé)任分離關(guān)系鲸湃。

其規(guī)定了權(quán)限被賦予角色時(shí)赠涮,或角色被賦予用戶時(shí),以及當(dāng)用戶在某一時(shí)刻激活一個(gè)角色時(shí)所應(yīng)遵循的強(qiáng)制性規(guī)則暗挑。

責(zé)任分離包括靜態(tài)責(zé)任分離和動(dòng)態(tài)責(zé)任分離笋除。主要包括以下約束:

  • 互斥角色: 同一用戶只能分配到一組互斥角色集合中至多一個(gè)角色,支持責(zé)任分離的原則炸裆±互斥角色是指各自權(quán)限互相制約的兩個(gè)角色。比如財(cái)務(wù)部有會(huì)計(jì)和審核員兩個(gè)角色,他們是互斥角色,那么用戶不能同時(shí)擁有這兩個(gè)角色,體現(xiàn)了職責(zé)分離原則
  • 基數(shù)約束: 一個(gè)角色被分配的用戶數(shù)量受限烹看;一個(gè)用戶可擁有的角色數(shù)目受限国拇;同樣一個(gè)角色對(duì)應(yīng)的訪問權(quán)限數(shù)目也應(yīng)受限,以控制高級(jí)權(quán)限在系統(tǒng)中的分配
  • 先決條件角色: 即用戶想獲得某上級(jí)角色,必須先獲得其下一級(jí)的角色

1.4 RBAC-3模型

即最全面的權(quán)限管理,它是基于RBAC-0听系,將RBAC-1和RBAC-2進(jìn)行了整合贝奇。

1.5 用戶組

當(dāng)平臺(tái)用戶基數(shù)增大,角色類型增多時(shí)靠胜,而且有一部分人具有相同的屬性掉瞳,比如財(cái)務(wù)部的所有員工,如果直接給用戶分配角色浪漠,管理員的工作量就會(huì)很大陕习。

如果把相同屬性的用戶歸類到某用戶組,那么管理員直接給用戶組分配角色址愿,用戶組里的每個(gè)用戶即可擁有該角色该镣,以后其他用戶加入用戶組后,即可自動(dòng)獲取用戶組的所有角色响谓,退出用戶組损合,同時(shí)也撤銷了用戶組下的角色省艳,無須管理員手動(dòng)管理角色。

根據(jù)用戶組是否有上下級(jí)關(guān)系,可以分為有上下級(jí)的用戶組和普通用戶組:

  • 具有上下級(jí)關(guān)系的用戶組: 最典型的例子就是部門和職位嫁审,可能多數(shù)人沒有把部門職位和用戶組關(guān)聯(lián)起來吧跋炕。當(dāng)然用戶組是可以拓展的,部門和職位常用于內(nèi)部的管理系統(tǒng)律适,如果是面向C端的系統(tǒng)辐烂。比如淘寶網(wǎng)的商家,商家自身也有一套組織架構(gòu)捂贿,比如采購(gòu)部纠修,銷售部,客服部厂僧,后勤部等扣草,有些人擁有客服權(quán)限,有些人擁有上架權(quán)限等等吁系,所以用戶組是可以拓展的
  • 普通用戶組: 即沒有上下級(jí)關(guān)系德召,和組織架構(gòu)白魂,職位都沒有關(guān)系汽纤,也就是說可以跨部門,跨職位福荸。舉個(gè)例子蕴坪,某電商后臺(tái)管理系統(tǒng),有拼團(tuán)活動(dòng)管理角色敬锐,我們可以設(shè)置一個(gè)拼團(tuán)用戶組背传,該組可以包括研發(fā)部的后臺(tái)開發(fā)人員,運(yùn)營(yíng)部的運(yùn)營(yíng)人員台夺,采購(gòu)部的人員等等径玖。

每個(gè)公司都會(huì)涉及到到組織和職位,下面就重點(diǎn)介紹這兩個(gè)。

1.5.1 組織

常見的組織架構(gòu)如

我們可以把組織與角色進(jìn)行關(guān)聯(lián)颤介,用戶加入組織后梳星,就會(huì)自動(dòng)獲得該組織的全部角色,無須管理員手動(dòng)授予滚朵,大大減少工作量冤灾,同時(shí)用戶在調(diào)崗時(shí),只需調(diào)整組織辕近,角色即可批量調(diào)整韵吨。

組織的另外一個(gè)作用是控制數(shù)據(jù)權(quán)限,把角色關(guān)聯(lián)到組織,那么該角色只能看到該組織下的數(shù)據(jù)權(quán)限。

1.5.2 職位

假設(shè)財(cái)務(wù)部的職位

每個(gè)組織部門下都會(huì)有多個(gè)職位移宅,比如財(cái)務(wù)部有總監(jiān)归粉,會(huì)計(jì)椿疗,出納等職位,雖然都在同一部門糠悼,但是每個(gè)職位的權(quán)限是不同的变丧,職位高的擁有更多的權(quán)限。

總監(jiān)擁有所有權(quán)限绢掰,會(huì)計(jì)和出納擁有部分權(quán)限痒蓬。特殊情況下,一個(gè)人可能身兼多職。

1.6 含有組織/職位/用戶組的模型

根據(jù)以上場(chǎng)景,新的權(quán)限模型就可以設(shè)計(jì)出來了,如下圖:

組織/職位/用戶組

根據(jù)系統(tǒng)的復(fù)雜度不同,其中的多對(duì)多關(guān)系和一對(duì)一關(guān)系可能會(huì)有變化

  • 在單系統(tǒng)且用戶類型單一的情況下滴劲,用戶和組織是一對(duì)一關(guān)系攻晒,組織和職位是一對(duì)多關(guān)系,用戶和職位是一對(duì)一關(guān)系班挖,組織和角色是一對(duì)一關(guān)系鲁捏,職位和角色是一對(duì)一關(guān)系,用戶和用戶組是多對(duì)對(duì)關(guān)系萧芙,用戶組和角色是一對(duì)一關(guān)系给梅,當(dāng)然這些關(guān)系也可以根據(jù)具體業(yè)務(wù)進(jìn)行調(diào)整。模型設(shè)計(jì)并不是死的,如果小系統(tǒng)不需要用戶組,這塊是可以去掉的双揪。
  • 分布式系統(tǒng)且用戶類型單一的情況下动羽,到這里權(quán)限系統(tǒng)就會(huì)變得很復(fù)雜,這里就要引入了一個(gè)"系統(tǒng)"概念渔期。此時(shí)系統(tǒng)架構(gòu)是個(gè)分布式系統(tǒng)运吓,權(quán)限系統(tǒng)獨(dú)立出來,負(fù)責(zé)所有的系統(tǒng)的權(quán)限控制疯趟,其他業(yè)務(wù)系統(tǒng)比如商品中心拘哨,訂單中心,用戶中心信峻,每個(gè)系統(tǒng)都有自己的角色和權(quán)限倦青,那么權(quán)限系統(tǒng)就可以配置其他系統(tǒng)的角色和權(quán)限。
  • 分布式系統(tǒng)且用戶類型多個(gè)的情況下盹舞,比如淘寶網(wǎng)产镐,它的用戶類型包括內(nèi)部用戶,商家矾策,普通用戶磷账,內(nèi)部用戶登錄多個(gè)后臺(tái)管理系統(tǒng),商家登錄商家中心贾虽,這些做權(quán)限控制逃糟,如果你作為架構(gòu)師,該如何來設(shè)計(jì)呢?大神可以在評(píng)論區(qū)留言交流哦!

2.授權(quán)流程

授權(quán)即給用戶授予角色,按流程可分為手動(dòng)授權(quán)和審批授權(quán)。權(quán)限中心可同時(shí)配置這兩種,可提高授權(quán)的靈活性绰咽。

  • 手動(dòng)授權(quán): 管理員登錄權(quán)限中心為用戶授權(quán)菇肃,根據(jù)在哪個(gè)頁(yè)面授權(quán)分為兩種方式:給用戶添加角色,給角色添加用戶取募。給用戶添加角色就是在用戶管理頁(yè)面琐谤,點(diǎn)擊某個(gè)用戶去授予角色,可以一次為用戶添加多個(gè)角色玩敏;給角色添加用戶就是在角色管理頁(yè)面斗忌,點(diǎn)擊某個(gè)角色,選擇多個(gè)用戶旺聚,實(shí)現(xiàn)了給批量用戶授予角色的目的织阳。
  • **審批授權(quán): **即用戶申請(qǐng)某個(gè)職位角色,那么用戶通過OA流程申請(qǐng)?jiān)摻巧榇猓缓笥缮霞?jí)審批唧躲,該用戶即可擁有該角色,不需要系統(tǒng)管理員手動(dòng)授予碱璃。

3.表結(jié)構(gòu)

有了上述的權(quán)限模型,設(shè)計(jì)表結(jié)構(gòu)就不難了,下面是多系統(tǒng)下的表結(jié)構(gòu),簡(jiǎn)單設(shè)計(jì)下,主要提供思路:

image

4.權(quán)限框架

  • Apache Shrio

  • Spring Security

在項(xiàng)目中可以采用其中一種框架,它們的優(yōu)缺點(diǎn)以及如何使用會(huì)在后面的文章中詳細(xì)介紹弄痹。

5.結(jié)語(yǔ)

權(quán)限系統(tǒng)可以說是整個(gè)系統(tǒng)中最基礎(chǔ),同時(shí)也可以很復(fù)雜的嵌器,在實(shí)際項(xiàng)目中肛真,會(huì)遇到多個(gè)系統(tǒng),多個(gè)用戶類型嘴秸,多個(gè)使用場(chǎng)景毁欣,這就需要具體問題具體分析庇谆,但最核心的RBAC模型是不變的,我們可以在其基礎(chǔ)上進(jìn)行擴(kuò)展來滿足需求岳掐。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市饭耳,隨后出現(xiàn)的幾起案子串述,更是在濱河造成了極大的恐慌,老刑警劉巖寞肖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纲酗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡新蟆,警方通過查閱死者的電腦和手機(jī)觅赊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琼稻,“玉大人吮螺,你說我怎么就攤上這事。” “怎么了鸠补?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵萝风,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我紫岩,道長(zhǎng)规惰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任泉蝌,我火速辦了婚禮歇万,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勋陪。我一直安慰自己堕花,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布粥鞋。 她就那樣靜靜地躺著缘挽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呻粹。 梳的紋絲不亂的頭發(fā)上壕曼,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音等浊,去河邊找鬼腮郊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筹燕,可吹牛的內(nèi)容都是我干的轧飞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼撒踪,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼过咬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起制妄,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤掸绞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后耕捞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衔掸,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年俺抽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了敞映。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡磷斧,死狀恐怖振愿,靈堂內(nèi)的尸體忽然破棺而出诗芜,到底是詐尸還是另有隱情,我是刑警寧澤埃疫,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布伏恐,位于F島的核電站,受9級(jí)特大地震影響栓霜,放射性物質(zhì)發(fā)生泄漏翠桦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一胳蛮、第九天 我趴在偏房一處隱蔽的房頂上張望销凑。 院中可真熱鬧,春花似錦仅炊、人聲如沸斗幼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜕窿。三九已至,卻和暖如春呆馁,著一層夾襖步出監(jiān)牢的瞬間桐经,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工浙滤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阴挣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓纺腊,卻偏偏與公主長(zhǎng)得像畔咧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揖膜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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