RBAC模型整合數據權限

在項目實際開發中咱們不光要控制一個用戶能訪問哪些資源,還須要控制用戶只能訪問資源中的某部分數據。java

控制一個用戶能訪問哪些資源咱們有很成熟的權限管理模型即RBAC,可是控制用戶只能訪問某部分資源(即咱們常說的數據權限)使用RBAC模型是不夠的,本文咱們嘗試在RBAC模型的基礎上融入數據權限的管理控制。程序員

首先讓咱們先看下RBAC模型。web

RBAC模型

RBAC是Role-BasedAccess Control的英文縮寫,意思是基於角色的訪問控制。數據庫

RBAC事先會在系統中定義出不一樣的角色,不一樣的角色擁有不一樣的權限,一個角色實際上就是一組權限的集合。而系統的全部用戶都會被分配到不一樣的角色中,一個用戶可能擁有多個角色。使用RBAC能夠極大地簡化權限的管理。服務器

RBAC模型還能夠細分爲RBAC0,RBAC1,RBAC2,RBAC3。這裏咱們不討論他們之間的差別,感興趣的同窗能夠自行研究,咱們主要聚焦於常見的RBAC0模型上。微信

以下圖就是一個經典RBAC0模型的數據庫設計。架構

RBAC0

在RBAC模型下,系統只會驗證用戶A是否屬於角色RoleX,而不會判斷用戶A是否能訪問只屬於用戶B的數據DataB。這種問題咱們稱之爲「水平權限管理問題」。併發

數據權限

列表數據權限,主要經過數據權限控制行數據,讓不一樣的人有不一樣的查看數據規則;要實現數據權限,最重要的是須要抽象出數據規則。app

數據規則

好比咱們系統的商機數據,須要從下面幾個維度來控制數據訪問權限。運維

  1. 銷售人員只能看本身的數據;
  2. 各大區的銷售經理只能看各區域的數據(安徽大區的銷售經理看安徽區域的商機數據),同理也適用於某BG分管領導只能看所在BG的商機數據;
  3. 財務人員只能看金額小於一萬的數據。

上面的這些維度就是數據規則。

這樣數據規則的幾個重點要素咱們也明晰了,就是規則字段規則表達式規則值,上面三個場景對應的規則分別以下:

  1. 規則字段:建立人,規則表達式:= ,規則值:當前登陸人
  2. 規則字段:所屬大區,規則表達式:= ,規則值:安徽大區
  3. 規則字段:銷售金額,規則表達式:< ,規則值:10000
數據規則
規則字段配置說明: 
條件表達式:大於/大於等於/小於/小於等於/等於/包含/模糊/不等於
規則值:指定值 ( 固定值/系統上下文變量 )

關聯資源、用戶

光有數據規則是不夠的,咱們還須要把數據規則跟資源和用戶進行綁定。

數據規則與資源的綁定很簡單,咱們只須要創建一箇中間表便可,以下圖所示:


這樣資源就能夠關聯上了數據規則。

在應用設計上咱們須要一個單獨的數據規則管理功能,方便咱們錄入數據規則,而後在資源管理頁面(好比商機列表)上就能夠選擇內置的數據規則進行資源與規則的綁定。

「那麼如何讓不一樣的用戶擁有不一樣的數據規則呢?」

在RBAC模型中,用戶是經過授予不一樣的角色來進行資源的管理,同理咱們可讓角色在授予權限的時候關聯上數據規則,這樣最終在系統上就體現爲不一樣的用戶擁有不一樣的數據規則。

有點拗口,咱們仍是按上面的例子來講。

銷售人員、大區銷售經理、財務人員屬於不一樣的角色,他們都擁有商機列表這個資源權限,可是在給這些角色綁定商機列表資源權限時咱們能夠勾選對應的數據規則(上面已經實現資源與數據規則的綁定)。體如今數據庫設計中咱們能夠在角色資源對應關係表 Role_Permission中添加一個字段用於存儲關聯的數據規則,若是有多個數據規則可使用分隔符分割。

最終RBAC模型演變成以下所示的模型:


按照上面的設計咱們須要區分各個大區管理的數據權限則須要創建不一樣的大區角色,如安徽大區銷售經理、上海大區銷售經理,而後分別給角色勾選對應的數據規則。這裏就相似於RBAC1中的角色繼承的概念了。

這樣咱們就基本實現了RBAC與數據規則的綁定,可是咱們還有個問題就是如何在系統中落地。

這裏咱們就要藉助大名鼎鼎的AOP來實現了,這篇文章只講原理不講實現,因此咱們只順帶提一下實現方案。

  1. 自定義一個數據權限的註解,好比叫 PermissionData
  2. 在對應的資源請求方法,好比商機列表上添加自定義註解 @PermissionData
  3. 利用AOP抓取到用戶對應角色的全部數據規則並進行SQL拼接,最終在SQL層面實現數據過濾。

繼續優化

在上面的設計中咱們經過給不一樣角色綁定不一樣數據規則實現了數據權限,可是考慮下面一種場景:某角色須要看到的數據範圍爲 「所屬大區爲安徽大區且事業部爲消費者事業部的商機數據」,在這種場景裏按照咱們以前的設計須要創建兩個數據規則:

  1. 所屬大區 = 安徽大區
  2. 所屬事業部 = 消費者事業部

而後再創建2個不一樣的角色,分別授予不一樣的數據規則,若是這樣的場景比較多的話很容易出現角色爆炸的狀況,全部咱們這裏再抽取出 數據規則組 的概念。

一個數據規則組有多個數據規則,數據規則之間經過 AND 進行鏈接,放一張應用設計圖:


體如今數據庫設計中就變成了以下所示:


小結

經過上面8張表的設計咱們實現了RBAC模型與數據權限的結合,固然這裏還有繼續優化的空間。好比這裏的規則字段和規則值咱們能夠抽取出對應的字典表,讓數據規則表去關聯這些字典字段,這樣在應用層配置數據規則的時候就不須要管理員手動填寫而是從字典項中去選擇了,減小了數據規則配置出錯的機率。

數據權限是一個實現相對比較複雜的功能,這裏咱們選擇的是在RBAC模型基礎上進行擴展,若是你有更好的解決方案歡迎留言告訴我。

End




乾貨分享



這裏爲你們準備了一份小小的禮物,關注公衆號,輸入以下代碼,便可得到百度網盤地址,無套路領取!

001:《程序員必讀書籍》
002:《從無到有搭建中小型互聯網公司後臺服務架構與運維架構》
003:《互聯網企業高併發解決方案》
004:《互聯網架構教學視頻》
006:《SpringBoot實現點餐系統》
007:《SpringSecurity實戰視頻》
008:《Hadoop實戰教學視頻》
009:《騰訊2019Techo開發者大會PPT》

010: 微信交流羣






近期熱文top



一、關於JWT Token 自動續期的解決方案

二、SpringBoot開發祕籍-事件異步處理

三、架構師之路-服務器硬件掃盲

四、基於Prometheus和Grafana的監控平臺 - 環境搭建

五、RocketMQ進階 - 事務消息



我就知道你「在看」





本文分享自微信公衆號 - JAVA日知錄(javadaily)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索