萬(wàn)字長(zhǎng)文:深入淺出RBAC權(quán)限設(shè)計(jì)
權(quán)限管理是B端中常見的話題,它規(guī)定了用戶各自的角色和可使用的職能,也對(duì)數(shù)據(jù)的安全提供了保障。本篇文章中作者結(jié)合自身經(jīng)驗(yàn),從四部分講述關(guān)于權(quán)限管理的設(shè)計(jì)經(jīng)驗(yàn)與設(shè)計(jì)方法。
權(quán)限管理是B端產(chǎn)品繞不開的話題,本文總結(jié)了我對(duì)權(quán)限管理的設(shè)計(jì)經(jīng)驗(yàn)與設(shè)計(jì)方法,共分為4個(gè)部分:
- 權(quán)限管理的概念梳理
- RBAC權(quán)限設(shè)計(jì)的一般步驟
- 設(shè)計(jì)功能權(quán)限的三板斧:基礎(chǔ)版(權(quán)限、角色、用戶管理)、進(jìn)階版(部門、職位、菜單管理)、拓展(版本管理)
- 如何設(shè)計(jì)數(shù)據(jù)權(quán)限
所有內(nèi)容均根據(jù)自身思考實(shí)踐及經(jīng)驗(yàn)借鑒而來(lái),如有錯(cuò)誤歡迎指正。
第一章:權(quán)限管理的概念梳理
一、權(quán)限是什么
權(quán)限包括了功能權(quán)限和數(shù)據(jù)權(quán)限:
- 功能權(quán)限是系統(tǒng)執(zhí)行權(quán)限控制的基本單元,包括頁(yè)面權(quán)限、菜單權(quán)限、按鈕權(quán)限等
- 數(shù)據(jù)權(quán)限包括基礎(chǔ)數(shù)據(jù)、業(yè)務(wù)數(shù)據(jù)、資源數(shù)據(jù)等
針對(duì)功能模塊劃分用戶權(quán)限是一種粗顆粒度的劃分方式,表現(xiàn)在不同用戶可以查看相同的數(shù)據(jù),但可執(zhí)行的操作不同,如線上數(shù)據(jù)庫(kù)的數(shù)據(jù)只有超管可以刪除,其他人只能查看;針對(duì)數(shù)據(jù)劃分用戶權(quán)限是一種細(xì)顆粒度的劃分方式,表現(xiàn)在不同用戶進(jìn)入同一頁(yè)面/菜單時(shí),可見的數(shù)據(jù)有差異,如運(yùn)營(yíng)經(jīng)理可以看到部門所有數(shù)據(jù),運(yùn)營(yíng)人員只能看到自己創(chuàng)建的數(shù)據(jù)。做權(quán)限設(shè)計(jì)時(shí),首先要分清功能權(quán)限和數(shù)據(jù)權(quán)限的界限,不要為了圖方便將二者揉起來(lái)。
二、為什么需要權(quán)限管理
- 崗位職責(zé)的需要
- 數(shù)據(jù)安全的需要
三、權(quán)限設(shè)計(jì)的核心思想
權(quán)限管理是用來(lái)控制用戶可以訪問(wèn)而且只能訪問(wèn)某些資源的系統(tǒng),根據(jù)該定義,我們可以繪制出如下示意圖:
可以看出,用戶和資源形成了錯(cuò)綜復(fù)雜的映射關(guān)系,很難管理。要解決這一問(wèn)題,有兩種方法:一是減少用戶/資源數(shù),顯然不切實(shí)際,這樣就只剩下了一種方法——減少映射關(guān)系。
在詳細(xì)介紹該方法前,我們先來(lái)看看數(shù)據(jù)庫(kù)中是如何解決查詢慢的問(wèn)題的。大家可以思考一個(gè)問(wèn)題,在【35、27、48、12、29、38、55】這組數(shù)列中如何快速找到數(shù)字55?
大部分人的第一反應(yīng)就是一個(gè)個(gè)遍歷,這樣一共需要查詢7次。而對(duì)數(shù)據(jù)庫(kù)工程師來(lái)說(shuō),首先會(huì)找到一個(gè)媒介來(lái)構(gòu)建這組數(shù)列的表示關(guān)系(見下圖-平衡二叉樹),然后再通過(guò)簡(jiǎn)單的判斷只用3次就可以找到55了。這個(gè)媒介就是數(shù)據(jù)庫(kù)中的索引,在數(shù)據(jù)量巨大的時(shí)候,利用索引進(jìn)行查詢的優(yōu)勢(shì)十分明顯。
如果這個(gè)例子不好理解,大家還可以聯(lián)想下字典中的索引、書籍中的目錄或是圖書館中的書架標(biāo)簽,核心思想都是抽象出對(duì)象的公共屬性,再進(jìn)行分類管理。
利用這一思想,我們?cè)賮?lái)回看如何減少用戶和資源的映射關(guān)系。
- 判斷用戶與用戶之間是否有公共屬性?
- 找到對(duì)權(quán)限有影響的公共屬性,比如部門、職位等
- 不斷抽象出中間媒介
對(duì)于資源也是同理。
經(jīng)過(guò)以上步驟,原本雜亂無(wú)章的映射關(guān)系就變得既簡(jiǎn)約又有層次(見下圖),我們只要把權(quán)限賦予到抽象出來(lái)的虛擬媒介上,就能夠大大降低管理的復(fù)雜程度。
四、權(quán)限管理模型的演進(jìn)
了解了權(quán)限設(shè)計(jì)的核心思想后,我們以CMS系統(tǒng)的更新為例來(lái)闡述權(quán)限管理模型的演進(jìn)。
1. ACL:基于用戶的權(quán)限管理模型
小王是一家創(chuàng)業(yè)公司的產(chǎn)品經(jīng)理,負(fù)責(zé)一款CMS系統(tǒng)的設(shè)計(jì)。起初,網(wǎng)站的所有內(nèi)容都由公司唯一的運(yùn)營(yíng)小紅負(fù)責(zé),所以小王就對(duì)小紅的賬號(hào)開啟了所有權(quán)限。
這種直接將權(quán)限綁定在用戶賬號(hào)上的方式就叫做基于用戶的權(quán)限管理(ACL)。
2. RBAC:基于角色的權(quán)限管理模型
隨著運(yùn)營(yíng)部門不斷發(fā)展壯大,每次有新員工入職,小王都要為其單獨(dú)配置權(quán)限,而且無(wú)法批量修改,十分繁瑣。同時(shí)小王發(fā)現(xiàn)運(yùn)營(yíng)部門分工明確,部分人員負(fù)責(zé)內(nèi)容審核,需要為他們開啟審核管理的權(quán)限;部分人員負(fù)責(zé)產(chǎn)出內(nèi)容,需要為他們開啟內(nèi)容管理的權(quán)限……這就導(dǎo)致小王經(jīng)常會(huì)做一些重復(fù)性的工作。于是小王就想在現(xiàn)有的用戶層上再抽象出一層——角色層,只要對(duì)角色設(shè)置權(quán)限,屬于該角色的人員就自動(dòng)擁有這些權(quán)限。
這種將權(quán)限綁定在角色上,再給用戶賬號(hào)賦予角色的方式就叫做基于角色的權(quán)限管理(RBAC),該模型于1992年由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院組織開發(fā),是目前最通用的權(quán)限管理模型,節(jié)省了很大的權(quán)限維護(hù)成本。
GerorgeMason大學(xué)的教授Ravi Sandhu于1996年對(duì)RBAC模型進(jìn)行改進(jìn),提出了RBAC96模型族,包括RBAC0、RBAC1、RBAC2和RBAC3四個(gè)模型。上圖代表RBAC0模型,也是其他3個(gè)模型的基礎(chǔ)。
a. RBAC1:角色繼承的RBAC模型
在CMS系統(tǒng)使用了一段時(shí)間后,小王發(fā)現(xiàn)了一個(gè)新問(wèn)題——系統(tǒng)中存在的角色太多了,因?yàn)橹灰袡?quán)限不一樣的用戶加入系統(tǒng),就需要新建一個(gè)角色,當(dāng)用戶權(quán)限分得很細(xì)的時(shí)候,甚至比ACL還繁瑣,于是小王就想著手解決這一問(wèn)題。
點(diǎn)他發(fā)現(xiàn)角色之間存在著類似組織架構(gòu)一樣的上下級(jí)關(guān)系,比如COO>運(yùn)營(yíng)經(jīng)理>運(yùn)營(yíng)主管>運(yùn)營(yíng)組長(zhǎng)>運(yùn)營(yíng)人員>運(yùn)營(yíng)實(shí)習(xí)生,并且上級(jí)擁有下級(jí)的所有權(quán)限,同時(shí)可以額外擁有其他權(quán)限,于是他在現(xiàn)有的角色基礎(chǔ)上又抽象出一層角色等級(jí)。
這種在角色中引入上下級(jí)關(guān)系的RBAC模型就叫做角色繼承的RBAC模型(RBAC1),通過(guò)給角色分級(jí),高級(jí)別的角色可繼承低級(jí)別角色的權(quán)限,一定程度上簡(jiǎn)化了權(quán)限管理工作。
另外角色間的繼承關(guān)系可分為一般繼承關(guān)系和受限繼承關(guān)系。一般繼承關(guān)系要求角色繼承關(guān)系是一個(gè)絕對(duì)偏序關(guān)系,允許角色間的多向繼承,即下級(jí)角色可以擁有多個(gè)上級(jí)角色,上級(jí)角色也可以擁有多個(gè)下級(jí)角色。而受限繼承關(guān)系則要求角色繼承關(guān)系是一個(gè)樹狀結(jié)構(gòu),角色間只能單向繼承,即下級(jí)角色只能擁有一個(gè)上級(jí)角色,但是上級(jí)角色可以擁有多個(gè)下級(jí)角色。
b. RBAC2:角色限制的RBAC模型
過(guò)了一段時(shí)間,運(yùn)營(yíng)經(jīng)理小紅向小王反饋,她的賬號(hào)竟然可以看到公司的財(cái)務(wù)賬單,經(jīng)過(guò)核查,是小王由于粗心導(dǎo)致給小紅的賬號(hào)多綁了一個(gè)財(cái)務(wù)經(jīng)理的角色。為了徹底規(guī)避這種風(fēng)險(xiǎn),小王就讓開發(fā)加了一條判斷:當(dāng)角色是運(yùn)營(yíng)經(jīng)理時(shí)不能同時(shí)是財(cái)務(wù)經(jīng)理。
這種針對(duì)角色進(jìn)行限制的模型就叫做角色限制的RBAC模型(RBAC2),可以把限制具體地分為靜態(tài)職責(zé)分離(SSD)和動(dòng)態(tài)職責(zé)分離(DSD):
SSD:
- 互斥角色:同一用戶只能分配到一組互斥角色集合中至多一個(gè)角色,比如用戶不能同時(shí)擁有會(huì)計(jì)和審計(jì)兩個(gè)角色
- 基數(shù)約束:一個(gè)用戶可擁有的角色數(shù)目受限;一個(gè)角色可被分配的用戶數(shù)量受限;一個(gè)角色對(duì)應(yīng)的權(quán)限數(shù)目受限
- 先決條件角色:用戶想要成為上級(jí)角色,必須先成為下一級(jí)角色,比如游戲中的轉(zhuǎn)職
DSD:允許一個(gè)用戶具有多個(gè)角色,但在運(yùn)行時(shí)只能激活其中某些角色,比如BOSS直聘,一個(gè)用戶既可以是招聘者也可以是應(yīng)聘者,但同時(shí)只能選擇一種身份進(jìn)行操作
c. RBAC3:統(tǒng)一的RBAC模型
RBAC3=RBAC1+RBAC2,既引入了角色間的繼承關(guān)系,又引入了角色限制關(guān)系。
d. 組:完善的RBAC模型
現(xiàn)有的權(quán)限管理模型雖然已經(jīng)對(duì)“角色”進(jìn)行了層級(jí)優(yōu)化,但并沒(méi)有優(yōu)化“用戶”方,這就意味著每入職一個(gè)新員工,小王得單獨(dú)為其設(shè)置權(quán)限,還是很麻煩,于是他利用抽象的思想將相同屬性的用戶進(jìn)行歸類。在公司里,最簡(jiǎn)單的相同屬性就是“部門”了,如果給部門賦予了角色和權(quán)限,那么這個(gè)部門中的所有用戶都有了部門權(quán)限,而不需要為每一個(gè)用戶再單獨(dú)指定角色。
用戶可以分組,權(quán)限同樣也可以分組。在權(quán)限特別多的情況下,可以把同一層級(jí)的權(quán)限合并為一個(gè)權(quán)限組,如二級(jí)菜單下面有十幾個(gè)按鈕,如果對(duì)按鈕的操作沒(méi)有角色限制,可以把這些按鈕權(quán)限與二級(jí)菜單權(quán)限合并為一個(gè)權(quán)限組,然后再把權(quán)限組賦予角色就可以了。
“組”概念的引入完善了RBAC模型,在簡(jiǎn)化操作的同時(shí)更貼近了實(shí)際業(yè)務(wù),便于理解。
3. ABAC:基于屬性的權(quán)限管理模型
為了內(nèi)容的安全,運(yùn)營(yíng)經(jīng)理小紅向小王提了一個(gè)需求:負(fù)責(zé)內(nèi)容管理的人員不可以在公司以外的地點(diǎn)發(fā)布內(nèi)容。這可難倒了小王,因?yàn)楝F(xiàn)有的RBAC權(quán)限模型僅能對(duì)頁(yè)面/功能/數(shù)據(jù)賦予權(quán)限,沒(méi)法執(zhí)行如此精細(xì)的權(quán)限控制。在查閱相關(guān)資料后,小王找到了該問(wèn)題的解決方法——基于屬性的權(quán)限管理模型(ABAC)。
ABAC是通過(guò)動(dòng)態(tài)計(jì)算一個(gè)或一組屬性是否滿足某種條件來(lái)進(jìn)行授權(quán)判斷的,包括用戶屬性(如性別年齡)、環(huán)境屬性(如時(shí)間地點(diǎn))、操作屬性(如編輯刪除)和對(duì)象屬性(如一篇文章)。
跟RBAC相比,ABAC能夠?qū)崿F(xiàn)非常靈活的權(quán)限控制,可擴(kuò)延展性也很高,幾乎能滿足所有類型的需求。但是設(shè)計(jì)起來(lái)比較復(fù)雜,而且對(duì)于單一屬性可以通過(guò)編寫簡(jiǎn)單的判斷邏輯代替,所以還沒(méi)有被廣泛應(yīng)用。
五、權(quán)限管理與權(quán)限體系
權(quán)限管理是指為解決某一具體的權(quán)限分配問(wèn)題而采用的方法,比如解決文件的權(quán)限分配問(wèn)題可以采用ACL模型,解決不同年齡段的用戶可訪問(wèn)不同類型的電影問(wèn)題可以采用RBAC+ABAC。
而權(quán)限體系是指整個(gè)系統(tǒng)內(nèi)采用的權(quán)限管理方法的集合。
本系列文章聚焦于單系統(tǒng)內(nèi)的RBAC權(quán)限管理。
六、權(quán)限設(shè)計(jì)的誤區(qū)
1. 唯RBAC論
盡管RBAC已經(jīng)被廣泛應(yīng)用,但還是要避免一上來(lái)就這么做。權(quán)限的設(shè)計(jì)需要評(píng)估數(shù)據(jù)量和業(yè)務(wù)復(fù)雜度,如果預(yù)估的數(shù)據(jù)量特別少,業(yè)務(wù)又很簡(jiǎn)單,那完全可以用其他方式。
2. 唯自由配置論
不要認(rèn)為把權(quán)限設(shè)置得靈活可配用戶就滿意了,實(shí)際上用戶沒(méi)有那么聰明,他會(huì)為角色名稱而糾結(jié),看到一系列的權(quán)限配置也會(huì)不知所措。如果你的業(yè)務(wù)能夠抽象出一些固定角色和統(tǒng)一權(quán)限,那就把他們內(nèi)置起來(lái)。
3. 權(quán)限越多/越細(xì)越好
權(quán)限不是功能列表,一味地細(xì)化而不注重實(shí)際業(yè)務(wù),只會(huì)增加開發(fā)工作量,也不利于用戶配置??梢詢H選擇常用的功能點(diǎn)作為權(quán)限配置,也可以將多個(gè)功能點(diǎn)抽象為一個(gè)權(quán)限點(diǎn),如將“增刪改”三個(gè)功能抽象為一個(gè)“管理”權(quán)限點(diǎn)。
第二章:RBAC權(quán)限設(shè)計(jì)的一般步驟
一、梳理角色
1. 羅列所有角色
角色是一種抽象的身份,RBAC離不開角色,因此第一步就是從業(yè)務(wù)中找到所有可能涉及到的角色。
如果你做的是企業(yè)內(nèi)部管理系統(tǒng)(如ERP、OA),可以參考組織架構(gòu)找到所有角色(如產(chǎn)品經(jīng)理、產(chǎn)品助理、項(xiàng)目負(fù)責(zé)人);其他系統(tǒng)可以通過(guò)業(yè)務(wù)流程找到相關(guān)角色,如開展一次線上筆試按流程需要出題老師、題目審查老師、考場(chǎng)管理員、助理、監(jiān)考老師、巡考老師、考生、閱卷老師。
2. 找到各角色之間的關(guān)系
找到所有角色后,第二步就是找出各角色之間的聯(lián)系。常見的有繼承、互斥和共享關(guān)系,還可根據(jù)實(shí)際業(yè)務(wù)找到角色之間的其他關(guān)系:
- 等級(jí)/繼承:產(chǎn)品總監(jiān)、產(chǎn)品經(jīng)理、產(chǎn)品助理、產(chǎn)品實(shí)習(xí)生
- 互斥:財(cái)務(wù)和審計(jì)不能是一個(gè)人
- 共享:閱卷老師和監(jiān)考老師可以是同一個(gè)人
- 串行:先由產(chǎn)品經(jīng)理進(jìn)行設(shè)計(jì)再由開發(fā)人員開發(fā)
- 并行:前端后端一起開發(fā)
- ……
3. 分析角色是否需要內(nèi)置以及是否需要隱藏
分析哪些角色我們可以事先定好,哪些角色可由用戶自定義。內(nèi)置角色適用于角色通用且固定、使用頻率高的情況,目的是為了簡(jiǎn)化用戶的操作步驟。常把“管理員”角色進(jìn)行內(nèi)置,也可根據(jù)實(shí)際業(yè)務(wù)選擇,比如線上考試系統(tǒng),“考生管理”菜單就屬于內(nèi)置角色,添加到該列表中的賬號(hào)只能是“考生”。
同樣還要考慮角色是否需要展示給用戶,比如一些系統(tǒng)的“超級(jí)管理員”就不需要展示給用戶。
二、梳理權(quán)限
1. 梳理功能權(quán)限
權(quán)限分為功能權(quán)限和數(shù)據(jù)權(quán)限,其中功能權(quán)限又可分為菜單權(quán)限和按鈕權(quán)限。
梳理功能權(quán)限一個(gè)最簡(jiǎn)單最實(shí)用的辦法就是用“功能列表”(下圖以“有贊”為例)。
2. 梳理數(shù)據(jù)權(quán)限
數(shù)據(jù)權(quán)限就是系統(tǒng)中存在的數(shù)據(jù)、資源能夠被誰(shuí)查看和管理。說(shuō)到數(shù)據(jù)權(quán)限,就不能不提數(shù)據(jù)庫(kù)。
1)表/對(duì)象
表是包含數(shù)據(jù)庫(kù)中所有數(shù)據(jù)的數(shù)據(jù)庫(kù)對(duì)象,不同的業(yè)務(wù)數(shù)據(jù)存在于不同的表中,如下圖從上到下依次為考生表、考場(chǎng)表和考官表。
2)數(shù)據(jù)
表中存放著二維數(shù)據(jù),由行和列組成,如下圖的考生表,每一行代表一個(gè)考生,每一列代表考生的一個(gè)屬性。
通過(guò)表和數(shù)據(jù)之間的關(guān)系,可以把數(shù)據(jù)權(quán)限分為以下四種情況:
(1)基于系統(tǒng)的數(shù)據(jù)權(quán)限
即系統(tǒng)中的所有表都能被大家看到并管理,也可理解為沒(méi)有數(shù)據(jù)權(quán)限,比如管理員A、B都能看到并管理所有考生、考官、考場(chǎng)數(shù)據(jù)。
(2)基于對(duì)象的數(shù)據(jù)權(quán)限
即按表劃分?jǐn)?shù)據(jù)權(quán)限,比如管理員A只負(fù)責(zé)管理考生,管理員B只負(fù)責(zé)管理考場(chǎng)。
(3)基于行的數(shù)據(jù)權(quán)限
即按表中的數(shù)據(jù)行劃分?jǐn)?shù)據(jù)權(quán)限,比如管理員A只能管理B學(xué)校的考生,但不能管理C學(xué)校的考生;或者A部門的經(jīng)理只能看到A部門職員的周報(bào)。
(4)基于列的數(shù)據(jù)權(quán)限
即按表中的數(shù)據(jù)列劃分?jǐn)?shù)據(jù)權(quán)限,比如管理員A只能看到考生的姓名,而管理員B可以看到考生的姓名、手機(jī)號(hào)和身份證號(hào)。
在梳理數(shù)據(jù)權(quán)限時(shí),可根據(jù)實(shí)際業(yè)務(wù)對(duì)對(duì)象、行和列的數(shù)據(jù)權(quán)限自由組合,比如針對(duì)學(xué)校A的管理員只能查看學(xué)校A的考生及考官的姓名和電話號(hào)碼,無(wú)法查看身份證號(hào)這個(gè)需求,就使用到了基于行和列的數(shù)據(jù)權(quán)限。
三、連接角色與權(quán)限
1. 連接角色和功能權(quán)限
得到功能列表后,需要跟角色關(guān)聯(lián)在一起,可直接在表后添加角色列,再根據(jù)業(yè)務(wù)對(duì)角色是否擁有該功能權(quán)限做判斷。
2. 連接角色和數(shù)據(jù)權(quán)限
數(shù)據(jù)權(quán)限一般是一系列的規(guī)則,可通過(guò)文字描述附在上表后。
3. 分析與整理
所有的權(quán)限都需要進(jìn)行分配,但不是每個(gè)權(quán)限都值得讓用戶來(lái)配置。
在上一步完成后,我們就建立起了所有角色和權(quán)限的聯(lián)系,但上表還不能直接使用,在詳細(xì)設(shè)計(jì)之前,還要分析出哪些權(quán)限需要用戶手動(dòng)分配,哪些不需要?哪些功能權(quán)限可以合并,以便減少用戶操作次數(shù)?什么場(chǎng)景下數(shù)據(jù)權(quán)限需要可配置?等等這些必須得根據(jù)具體的業(yè)務(wù)進(jìn)行判斷。
仍以“有贊”為例,上圖是配置“線索管理”功能權(quán)限的實(shí)際頁(yè)面,可以看到它只為用戶提供“查看、編輯、轉(zhuǎn)讓、放棄、添加資料項(xiàng)、辦理試聽”這幾個(gè)功能,其他的功能權(quán)限要么都?xì)w屬于“查看”(添加、辦理報(bào)名等),要么合并到一個(gè)功能里(“批量轉(zhuǎn)讓”合并到“轉(zhuǎn)讓”)。
理論上是可以把所有的功能權(quán)限拿出來(lái)讓用戶配置,但是考慮到用戶體驗(yàn),對(duì)權(quán)限進(jìn)行分析和整理是非常有必要的。
第三章:設(shè)計(jì)功能權(quán)限的三板斧
通過(guò)上述分析,我們得到了最終的角色與權(quán)限的關(guān)系,接下來(lái)就進(jìn)入到如何設(shè)計(jì)界面的環(huán)節(jié)。
設(shè)計(jì)功能權(quán)限離不開最基本的三要素:用戶管理、角色管理、權(quán)限管理;根據(jù)業(yè)務(wù)的不同,可能還會(huì)涉及更復(fù)雜的三要素:部門管理、職位管理、菜單管理,在這些之上還會(huì)配置不同的版本滿足不同的客戶需求,這就需要版本管理,下文將會(huì)對(duì)如何設(shè)計(jì)這些管理功能進(jìn)行詳細(xì)的介紹。
一、三板斧-基礎(chǔ)版
1. 權(quán)限管理
權(quán)限管理是為角色賦予權(quán)限,權(quán)限可以內(nèi)置,也支持用戶自定義,權(quán)限的配置需要跟角色綁在一起,當(dāng)權(quán)限較簡(jiǎn)單且相對(duì)固定時(shí),可由后端人員寫死在代碼里或者寫死在配置文件里。
2. 角色管理
在“梳理角色”步驟中,我們列出了系統(tǒng)中涉及到的所有角色,“角色管理”就是對(duì)這些角色進(jìn)行線上化的鏡像和管理。
按角色的來(lái)源可分為用戶自定義角色和系統(tǒng)內(nèi)置角色:
自定義角色:角色的名稱和權(quán)限都可由用戶自由配置,并可任意修改。
內(nèi)置角色:角色的名稱和權(quán)限由系統(tǒng)內(nèi)置好,用戶僅可查看無(wú)法修改。
設(shè)計(jì)“角色管理”主要有三個(gè)頁(yè)面:
- 角色列表頁(yè):展示系統(tǒng)中的所有角色,至少應(yīng)顯示角色名稱以及查詢、刪除(自定義角色)、查看(內(nèi)置角色)、新增、編輯等操作。
- 添加角色頁(yè):必須輸入不可重復(fù)的角色名稱,可選填狀態(tài)、備注、排序等信息。交互方式上可根據(jù)頁(yè)面內(nèi)容的豐富程度選擇彈窗或抽屜的形式。
- 配置權(quán)限頁(yè):可在創(chuàng)建角色的同時(shí)配置權(quán)限(見上圖),也可在創(chuàng)建角色后配置權(quán)限(見下圖),兩種方式?jīng)]有本質(zhì)區(qū)別。
另外在一些系統(tǒng)里,綁定權(quán)限的這個(gè)載體不叫“角色”,而是其他的名字,比如在釘釘中叫“管理組”,這里我們要清楚它其實(shí)就是“角色”。
3. 用戶管理
“用戶管理”是用于管理用戶信息的,如更改用戶角色、創(chuàng)建或刪除用戶、更改密碼和用戶信息。
設(shè)計(jì)“用戶管理”主要有兩個(gè)頁(yè)面:
- 用戶列表頁(yè):展示系統(tǒng)中所有的用戶。應(yīng)支持新增、編輯、刪除、導(dǎo)出、導(dǎo)入及批量操作。
- 添加用戶頁(yè):根據(jù)業(yè)務(wù)選擇創(chuàng)建時(shí)需要的字段。添加用戶時(shí),必須為用戶設(shè)置角色,可選角色為“角色列表”中存在的自定義角色和內(nèi)置角色。
同“權(quán)限分配”一樣,“角色分配”也可以單獨(dú)放在用戶列表中的操作里,這樣的交互更專一,但實(shí)際沒(méi)有什么不同。
4. 注意事項(xiàng)
1)用戶與角色
需要根據(jù)實(shí)際業(yè)務(wù)確定一個(gè)用戶可以綁定多少個(gè)角色。如果可以綁定多個(gè)角色,角色之間有沒(méi)有繼承、互斥等關(guān)系,功能權(quán)限如何劃分,這些情況都要提前考慮到。
另外,如果有內(nèi)置角色,別忘了在內(nèi)部的“運(yùn)營(yíng)管理平臺(tái)”上設(shè)計(jì)專門針對(duì)“內(nèi)置角色”的管理功能。
2)角色間的關(guān)系
上文中我們列出了角色之間的關(guān)系(等級(jí)/繼承、互斥、共享等),現(xiàn)有的“角色管理”僅能通過(guò)一個(gè)用戶綁定多個(gè)角色的方式實(shí)現(xiàn)“角色共享”,但沒(méi)法實(shí)現(xiàn)角色間的繼承和互斥。
角色間如果有繼承關(guān)系,可通過(guò)下文的“角色組(職位)管理”實(shí)現(xiàn);如果有互斥關(guān)系(如會(huì)計(jì)和審計(jì)),對(duì)于內(nèi)置角色可以在代碼中寫死判斷,對(duì)于自定義角色,可以讓用戶另外設(shè)置互斥規(guī)則。
3)權(quán)限組
上文說(shuō)的分析與整理,其實(shí)就是建立權(quán)限組,將不必要的權(quán)限進(jìn)行合并,可以簡(jiǎn)化用戶操作。
經(jīng)過(guò)以上步驟,一個(gè)基本的權(quán)限系統(tǒng)就設(shè)計(jì)完成了,足夠應(yīng)付80%的場(chǎng)景。
二、三板斧-進(jìn)階版
如果是做OA系統(tǒng)的權(quán)限管理,或者對(duì)靈活度有較高的要求,那么可以了解下進(jìn)階版的權(quán)限管理三板斧。
1. 部門管理
“部門管理”有三種使用場(chǎng)景。第一種是為了構(gòu)建企業(yè)的組織架構(gòu),在這種情況下,部門管理與功能權(quán)限沒(méi)有關(guān)系,僅用于歸類用戶以及分配數(shù)據(jù)權(quán)限。
與功能權(quán)限有關(guān)系的是下面兩種場(chǎng)景:
第二種場(chǎng)景是為了承擔(dān)“用戶組”的作用。在上文介紹RBAC中,如果用戶量很多時(shí),將每個(gè)用戶與角色權(quán)限匹配會(huì)十分麻煩,這時(shí)就需要將用戶的共有屬性做抽象,在企業(yè)中,用戶的共有屬性可以用部門來(lái)表示。
第三種場(chǎng)景是為了承擔(dān)“角色”的作用,可以為部門直接賦予功能權(quán)限,部門中的用戶繼承該部門的功能權(quán)限。若用戶也擁有其他角色的權(quán)限(如下圖的用戶2),則實(shí)際的功能權(quán)限為二者的并集。
另外在分配部門權(quán)限時(shí),還需要考慮子部門與父部門的權(quán)限關(guān)系:可以選擇同父部門的權(quán)限保持一致,也可以選擇子部門繼承父部門的權(quán)限,并可在其范圍內(nèi)進(jìn)行編輯,還可以設(shè)置完全區(qū)別于父部門的權(quán)限,這取決于業(yè)務(wù)的復(fù)雜程度。
2. 職位管理
“職位管理”有兩種使用場(chǎng)景。第一種是為了完善員工信息,屬于一種屬性,與功能權(quán)限沒(méi)有關(guān)系。
第二種場(chǎng)景與功能權(quán)限相關(guān),是為了承擔(dān)“角色組”的作用?!敖巧M”是為了滿足上下級(jí)關(guān)系而衍生出的概念,比如“產(chǎn)品經(jīng)理”應(yīng)該擁有“產(chǎn)品助理”的所有權(quán)限,有了上下級(jí)后,再來(lái)一個(gè)“產(chǎn)品總監(jiān)”的角色,就不用單獨(dú)為其設(shè)置所有的功能權(quán)限,只需將它設(shè)為“產(chǎn)品經(jīng)理”角色的父級(jí),再添加一些特殊的權(quán)限即可。
3. 菜單管理
不管是“部門”還是“職位”,解決的都是“用戶”和“角色”怎樣配置更靈活的問(wèn)題。在RBAC中還有一個(gè)“權(quán)限”,目前對(duì)權(quán)限的管理只介紹了可以通過(guò)后端人員寫死在代碼里或者寫死在配置文件里,如果功能權(quán)限經(jīng)常變動(dòng),并且自由配置的需求極高,有沒(méi)有更靈活的辦法來(lái)管理權(quán)限呢?有!就是“菜單管理”。
“菜單管理”又被稱為資源管理,是系統(tǒng)資源對(duì)外的表現(xiàn)形式。有了“菜單管理”,不僅可以讓權(quán)限的管理更簡(jiǎn)單(不需要后端寫死),還能夠讓系統(tǒng)展示更靈活(能夠改菜單信息)。
“菜單”分為三類:
- 目錄:在系統(tǒng)內(nèi)沒(méi)有實(shí)際頁(yè)面
- 菜單:存在實(shí)際頁(yè)面
- 按鈕:菜單中的可操作項(xiàng)
設(shè)計(jì)“菜單管理”主要有兩個(gè)頁(yè)面:
1)菜單列表頁(yè):
導(dǎo)航菜單是分上下級(jí)的,因此可以用樹狀圖表示,常見的菜單屬性包括菜單名稱、菜單類型(目錄、菜單、按鈕)、圖標(biāo)、排序、路由地址(瀏覽器訪問(wèn)菜單的地址)、組件路徑(項(xiàng)目的組件文件的路徑)、權(quán)限標(biāo)識(shí)(查看、編輯、添加等)、是否外鏈、啟用狀態(tài)和創(chuàng)建時(shí)間。除了圖中展示的字段,根據(jù)業(yè)務(wù)需求還可以增加“編號(hào)、是否打開新頁(yè)面、是否隱藏、是否緩存(切換到其他菜單當(dāng)前菜單會(huì)進(jìn)行緩存)”等字段。
2)添加菜單頁(yè):
添加目錄:目錄可以是外鏈,即點(diǎn)擊后跳轉(zhuǎn)到外部地址,必須帶上https://或者h(yuǎn)ttp://,如果不是外鏈,則需要填入路由地址,由開發(fā)人員給出。
添加菜單:當(dāng)菜單是外鏈時(shí),規(guī)則同目錄,若不是外鏈,則可選填組件名稱、權(quán)限標(biāo)識(shí)、組件路徑(具體應(yīng)跟開發(fā)討論系統(tǒng)中是否有涉及)。
添加按鈕:添加按鈕時(shí),輸入權(quán)限標(biāo)識(shí)即可。
4. 注意事項(xiàng)
1)誰(shuí)繼承誰(shuí)
關(guān)于“權(quán)限繼承”,細(xì)心的讀者會(huì)發(fā)現(xiàn)我在第一章介紹RBAC時(shí)寫過(guò):“高級(jí)別的角色可繼承低級(jí)別角色的權(quán)限”,而在本章中又說(shuō):“子部門可以繼承父部門的權(quán)限”,是不是沖突了。
其實(shí)不然,假設(shè)現(xiàn)有AB兩個(gè)部門,要在它們之上設(shè)立一個(gè)部門C,則C部門的權(quán)限為AB兩個(gè)部門的并集,從這個(gè)角度講,部門C繼承了部門AB的權(quán)限,且部門C還可單獨(dú)設(shè)置權(quán)限;而如果要給部門A下設(shè)一個(gè)部門C,部門C會(huì)繼承部門A的權(quán)限,并可在此范圍內(nèi)細(xì)化權(quán)限。兩種說(shuō)法表達(dá)的意思是一樣的,都是子級(jí)屬于父級(jí)的權(quán)限范圍內(nèi)。
2)功能權(quán)限最好不要綁在多個(gè)實(shí)體上
在上面的介紹中,“部門”、“職位”都可以充當(dāng)“角色組”直接綁定功能權(quán)限,但在實(shí)際中卻很少有系統(tǒng)這么設(shè)計(jì),根本的原因就是沒(méi)有必要——功能權(quán)限最好只綁在一個(gè)實(shí)體上,意思是說(shuō),如果系統(tǒng)中已經(jīng)有了“角色管理”(為角色設(shè)置功能權(quán)限),就沒(méi)有必要再對(duì)部門或職位設(shè)置功能權(quán)限了,同樣如果系統(tǒng)中已經(jīng)為了部門/職位設(shè)置了權(quán)限,也就沒(méi)有必要再引出“角色”這個(gè)概念了。因?yàn)樵诂F(xiàn)實(shí)工作中,很少有人在部門、職位和角色上有單獨(dú)的功能權(quán)限,即便是有,也可以通過(guò)新建一種“角色”來(lái)簡(jiǎn)化復(fù)雜度。如今大部分的OA系統(tǒng)上,職位和部門更多被用于用戶歸類以及管理數(shù)據(jù)權(quán)限。
3)菜單管理如何實(shí)現(xiàn)權(quán)限組
需要注意的是,“菜單管理”是精細(xì)到系統(tǒng)中最小的操作,可以直接用于分配角色的權(quán)限,但如果為了提升用戶體驗(yàn),需要給用戶展示出合并后的功能權(quán)限時(shí)(見下圖),則不可在“菜單管理”中直接設(shè)置“查看與操作”的按鈕,而應(yīng)該在“菜單管理”之上建一層專門用于展示給用戶的功能權(quán)限,其中“查看與操作”權(quán)限綁定了“新建+編輯+刪除”的按鈕。
5. 拓展:版本管理
對(duì)于SAAS軟件,常常會(huì)分多個(gè)版本來(lái)滿足不同層次的客戶需求,不同版本之間的功能權(quán)限會(huì)有差異。面對(duì)這種情況,可以通過(guò)“版本管理”來(lái)實(shí)現(xiàn)靈活管理(此“版本”非產(chǎn)品迭代的版本)。
設(shè)計(jì)“版本管理”主要有兩個(gè)頁(yè)面:
- 版本列表頁(yè):列表展示版本的信息。
- 版本功能權(quán)限配置頁(yè):類似于為角色分配權(quán)限,這里可以理解為為版本分配權(quán)限。不同的是這里的功能權(quán)限會(huì)比“菜單管理”中的權(quán)限更細(xì)致。以“題目管理”為例,一般在“菜單管理”中,只會(huì)設(shè)置到一級(jí)頁(yè)面的“添加、導(dǎo)入、刪除、編輯題目”按鈕,但在版本管理中會(huì)細(xì)化到題目類型,如免費(fèi)版不能添加“聽力題”,甚至?xí)?duì)功能的可用次數(shù)進(jìn)行限制。有兩種設(shè)計(jì)方案可以解決這一需求,如果每個(gè)版本之間的權(quán)限分得又細(xì)又多(見本節(jié)第一張圖,考試星的版本功能對(duì)比),那么最好在菜單管理中覆蓋掉所有子頁(yè)面的按鈕,可用次數(shù)以單獨(dú)的規(guī)則進(jìn)行限制;如果版本之間只是個(gè)別的細(xì)小功能有差異,則在現(xiàn)有“菜單管理”的功能基礎(chǔ)上添加限制規(guī)則即可。
還有一種更復(fù)雜的情況,同一版本的不同客戶之間也會(huì)有不同的功能權(quán)限,那么還需要對(duì)每一個(gè)客戶配置功能限制。
第四章:如何設(shè)計(jì)數(shù)據(jù)權(quán)限
上文講過(guò)數(shù)據(jù)權(quán)限分為四種情況(劃分依據(jù)詳見第二章):
- 基于系統(tǒng)的數(shù)據(jù)權(quán)限
- 基于對(duì)象的數(shù)據(jù)權(quán)限
- 基于行的數(shù)據(jù)權(quán)限
- 基于列的數(shù)據(jù)權(quán)限
其中”基于系統(tǒng)的數(shù)據(jù)權(quán)限”可以理解為不分?jǐn)?shù)據(jù)權(quán)限,因?yàn)榇蠹铱吹降暮涂刹僮鞯膬?nèi)容都是一樣的;“基于對(duì)象的數(shù)據(jù)權(quán)限”可以通過(guò)功能權(quán)限來(lái)實(shí)現(xiàn),比如為用戶A分配了客戶表的權(quán)限,那么A就能夠看到并操作所有客戶,也就相當(dāng)于為用戶A分配了“客戶管理”的功能權(quán)限。因此下文主要討論后兩種情況。
另外,數(shù)據(jù)權(quán)限的分配也可分為內(nèi)置和用戶自定義兩種。內(nèi)置數(shù)據(jù)權(quán)限屬于系統(tǒng)中寫死的規(guī)則,如本校老師只能看到本校的資源,公共庫(kù)中的資源所有學(xué)校的老師均可看到,銷售人員創(chuàng)建的線索只有自己能夠管理等等,內(nèi)置數(shù)據(jù)權(quán)限過(guò)于簡(jiǎn)單,也不在本文討論范圍內(nèi)。
一、基于行的數(shù)據(jù)權(quán)限
基于行的數(shù)據(jù)權(quán)限分為兩種情況,一種是為對(duì)象(部門/角色)分配數(shù)據(jù),如上級(jí)部門可以管理下級(jí)部門的所有數(shù)據(jù);還可以將數(shù)據(jù)分配給對(duì)象,如共享文件。
1. 為對(duì)象分配數(shù)據(jù)
1)無(wú)組織架構(gòu)
對(duì)于不涉及組織架構(gòu)的系統(tǒng),數(shù)據(jù)權(quán)限的設(shè)計(jì)比較簡(jiǎn)單,在為角色配置權(quán)限時(shí),一并展示可分配的數(shù)據(jù)權(quán)限即可。
分配數(shù)據(jù)權(quán)限的前提是分配了對(duì)應(yīng)的功能權(quán)限,比如要讓計(jì)算機(jī)老師只能管理“軟件工程”的所有題目,前提是要給老師開啟“題庫(kù)管理”的功能權(quán)限,否則老師連“題庫(kù)管理”都看不到,何來(lái)管理其中的題目數(shù)據(jù)。當(dāng)然功能權(quán)限不一定非要手動(dòng)分配,也可以內(nèi)置,比如藍(lán)湖,加入的成員默認(rèn)開啟了“團(tuán)隊(duì)文件”的菜單,所以在配置時(shí)只需要展示數(shù)據(jù)權(quán)限列表。
2)有組織架構(gòu)
可以通過(guò)設(shè)置“管理范圍”實(shí)現(xiàn)上下級(jí)之間的數(shù)據(jù)權(quán)限控制。比如針對(duì)上級(jí)可以看到下級(jí)的題庫(kù)這一需求,可以設(shè)置一個(gè)“部門負(fù)責(zé)人”角色,并設(shè)置管理范圍為“所在部門和下級(jí)部門”,然后將公司領(lǐng)導(dǎo)、各部門負(fù)責(zé)人都添加成這個(gè)角色,即可實(shí)現(xiàn)該需求。
也可以通過(guò)設(shè)置“管理范圍”實(shí)現(xiàn)跨部門之間的數(shù)據(jù)權(quán)限控制。比如針對(duì)研發(fā)部負(fù)責(zé)人可以看到IT部門題目的需求,則可以新建一個(gè)角色,管理范圍選擇“特定部門”,并勾選“研發(fā)部和IT部”。
還可以通過(guò)設(shè)置“管理范圍”實(shí)現(xiàn)同部門之間的數(shù)據(jù)權(quán)限控制。比如都是產(chǎn)品部,產(chǎn)品組長(zhǎng)能看到下屬創(chuàng)建的題目,但看不到產(chǎn)品總監(jiān)創(chuàng)建的題目,產(chǎn)品助理只能看到自己創(chuàng)建的題目,這時(shí)就需要用到職位的層級(jí)關(guān)系。
2. 為數(shù)據(jù)分配對(duì)象
可以理解為把數(shù)據(jù)直接共享給某個(gè)角色/部門,常用于文件/資源的共享,下圖是釘釘上對(duì)文件的權(quán)限管理。
二、基于列的數(shù)據(jù)權(quán)限
如果說(shuō)數(shù)據(jù)權(quán)限是對(duì)功能權(quán)限在縱向的擴(kuò)展,那么字段權(quán)限就是在橫向的擴(kuò)展。因?yàn)樵O(shè)置數(shù)據(jù)列權(quán)限可以禁止指定角色對(duì)某些敏感字段的訪問(wèn),如身份證號(hào)、交易金額等。
設(shè)計(jì)“列權(quán)限”主要有兩個(gè)頁(yè)面:
- 入口:可以在創(chuàng)建角色時(shí)一同設(shè)置,也可以單獨(dú)作為角色的一個(gè)操作,還可以放在“角色管理”中對(duì)所有角色批量設(shè)置,更可以在對(duì)應(yīng)的菜單頁(yè)面中進(jìn)行設(shè)置。
- 列權(quán)限設(shè)置頁(yè):下圖展示的是對(duì)所有角色批量設(shè)置列權(quán)限的設(shè)計(jì),列出有各功能權(quán)限的角色和該菜單中的字段,由用戶勾選即可。
全文完。
最后做個(gè)總結(jié),本文第一章講了權(quán)限管理的基本概念,第二章講了RBAC權(quán)限管理在設(shè)計(jì)前的分析步驟,第三章和第四章分別講了如何設(shè)計(jì)功能權(quán)限(權(quán)限、角色、用戶、部門、職位、菜單、版本)和數(shù)據(jù)權(quán)限(基于行和基于列)。文中部分圖片手機(jī)看不清,可用電腦端打開,內(nèi)容如有錯(cuò)誤歡迎指正。
本文由 @產(chǎn)品亂彈 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)作者許可,禁止轉(zhuǎn)載
題圖來(lái)自 unsplash,基于 CC0 協(xié)議
該文觀點(diǎn)僅代表作者本人,人人都是產(chǎn)品經(jīng)理平臺(tái)僅提供信息存儲(chǔ)空間服務(wù)。
好文
受益匪淺!
受益匪淺,好文
好厲害,目前最大的難題就是在數(shù)據(jù)權(quán)限問(wèn)題上,茅塞頓開
好文章
好文!
牛皮,基本包含了90%的權(quán)限控制場(chǎng)景,可否再寫一些更復(fù)雜的數(shù)據(jù)權(quán)限分析
好文章
功能權(quán)限方便抽象,好設(shè)計(jì),但數(shù)據(jù)權(quán)限個(gè)性化好像太強(qiáng),定制成本比較大
很強(qiáng)
好文,可惜電腦端也看不清圖,555
是呀,不知道為啥圖片要壓縮這么多
難得一見的好文
牛逼
太強(qiáng)了吧?。?/p>