資料許可權就該這麼設計,yyyds!
大家好,我是飄渺!
在專案實際開發中我們不光要控制一個使用者能訪問哪些資源,還需要控制使用者只能訪問資源中的某部分資料。
控制一個使用者能訪問哪些資源我們有很成熟的許可權管理模型即RBAC,但是控制使用者只能訪問某部分資源(即我們常說的資料許可權)使用RBAC模型是不夠的,本文我們嘗試在RBAC模型的基礎上融入資料許可權的管理控制。
首先讓我們先看下RBAC模型。
RBAC模型
RBAC是Role-BasedAccess Control的英文縮寫,意思是基於角色的訪問控制。
RBAC事先會在系統中定義出不同的角色,不同的角色擁有不同的許可權,一個角色實際上就是一組許可權的集合。而系統的所有使用者都會被分配到不同的角色中,一個使用者可能擁有多個角色。使用RBAC可以極大地簡化許可權的管理。
RBAC模型還可以細分為RBAC0,RBAC1,RBAC2,RBAC3。這裡我們不討論他們之間的差異,感興趣的同學可以自行研究,我們主要聚焦於常見的RBAC0模型上。
如下圖就是一個經典RBAC0模型的資料庫設計。
在RBAC模型下,系統只會驗證使用者A是否屬於角色RoleX,而不會判斷使用者A是否能訪問只屬於使用者B的資料DataB。這種問題我們稱之為“水平許可權管理問題”。
資料許可權
列表資料許可權,主要透過資料許可權控制行資料,讓不同的人有不同的檢視資料規則;要實現資料許可權,最重要的是需要抽象出資料規則。
資料規則
比如我們系統的商機資料,需要從下面幾個維度來控制資料訪問許可權。
銷售人員只能看自己的資料; 各大區的銷售經理只能看各區域的資料(安徽大區的銷售經理看安徽區域的商機資料),同理也適用於某BG分管領導只能看所在BG的商機資料; 財務人員只能看金額小於一萬的資料。
上面的這些維度就是資料規則。
這樣資料規則的幾個重點要素我們也明晰了,就是規則欄位,規則表示式,規則值,上面三個場景對應的規則分別如下:
規則欄位:建立人,規則表示式:= ,規則值:當前登入人 規則欄位:所屬大區,規則表示式:= ,規則值:安徽大區 規則欄位:銷售金額,規則表示式:< ,規則值:10000
規則欄位配置說明:
條件表示式:大於/大於等於/小於/小於等於/等於/包含/模糊/不等於
規則值:指定值 ( 固定值/系統上下文變數 )
關聯資源、使用者
光有資料規則是不夠的,我們還需要把資料規則跟資源和使用者進行繫結。
資料規則與資源的繫結很簡單,我們只需要建立一箇中間表即可,如下圖所示:
這樣資源就可以關聯上了資料規則。
在應用設計上我們需要一個單獨的資料規則管理功能,方便我們錄入資料規則,然後在資源管理頁面(比如商機列表)上就可以選擇內建的資料規則進行資源與規則的繫結。
那麼如何讓不同的使用者擁有不同的資料規則呢?
在RBAC模型中,使用者是透過授予不同的角色來進行資源的管理,同理我們可以讓角色在授予許可權的時候關聯上資料規則,這樣最終在系統上就體現為不同的使用者擁有不同的資料規則。
有點拗口,我們還是按上面的例子來說。
銷售人員、大區銷售經理、財務人員屬於不同的角色,他們都擁有商機列表這個資源許可權,但是在給這些角色繫結商機列表資源許可權時我們可以勾選對應的資料規則(上面已經實現資源與資料規則的繫結)。體現在資料庫設計中我們可以在角色資源對應關係表 Role_Permission
中新增一個欄位用於儲存關聯的資料規則,如果有多個資料規則可以使用分隔符分割。
最終RBAC模型演變成如下所示的模型:
按照上面的設計我們需要區分各個大區管理的資料許可權則需要建立不同的大區角色,如安徽大區銷售經理、上海大區銷售經理,然後分別給角色勾選對應的資料規則。這裡就類似於RBAC1中的角色繼承的概念了。
這樣我們就基本實現了RBAC與資料規則的繫結,但是我們還有個問題就是如何在系統中落地。
這裡我們就要藉助大名鼎鼎的AOP來實現了,這篇文章只講原理不講實現,所以我們只順帶提一下實現方案。
自定義一個資料許可權的註解,比如叫 PermissionData
在對應的資源請求方法,比如商機列表上新增自定義註解 @PermissionData
利用AOP抓取到使用者對應角色的所有資料規則並進行SQL拼接,最終在SQL層面實現資料過濾。
繼續最佳化
在上面的設計中我們透過給不同角色繫結不同資料規則實現了資料許可權,但是考慮下面一種場景:某角色需要看到的資料範圍為 “所屬大區為安徽大區且事業部為消費者事業部的商機資料”,在這種場景裡按照我們之前的設計需要建立兩個資料規則:
所屬大區 = 安徽大區 所屬事業部 = 消費者事業部
然後再建立2個不同的角色,分別授予不同的資料規則,如果這樣的場景比較多的話很容易出現角色爆炸的情況,所有我們這裡再抽取出 資料規則組 的概念。
一個資料規則組有多個資料規則,資料規則之間透過 AND 進行連線,放一張應用設計圖:
體現在資料庫設計中就變成了如下所示:
小結
透過上面8張表的設計我們實現了RBAC模型與資料許可權的結合,當然這裡還有繼續最佳化的空間。比如這裡的規則欄位和規則值我們可以抽取出對應的字典表,讓資料規則表去關聯這些字典欄位,這樣在應用層配置資料規則的時候就不需要管理員手動填寫而是從字典項中去選擇了,減少了資料規則配置出錯的機率。
資料許可權是一個實現相對比較複雜的功能,這裡我們選擇的是在RBAC模型基礎上進行擴充套件,如果你有更好的解決方案歡迎留言告訴我。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2929244/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 許可權設計
- win10 資料夾許可權怎麼設定_win10如何設定資料夾訪問許可權Win10訪問許可權
- 許可權系統:一文搞懂功能許可權、資料許可權
- 通用許可權系統之資料庫表設計資料庫
- SAP Basis DEBUG改表資料許可權角色設計
- 許可權系統:許可權應用服務設計
- android 許可權元件設計Android元件
- JavaWeb許可權設計原理JavaWeb
- 許可權系統:許可權應用服務設計Tu
- 許可權系統:6個許可權概念模型設計模型
- Linux特殊許可權,這一篇就夠了Linux
- 如何設計應用系統的資料許可權管理
- 資料湖統一後設資料與許可權
- 授權許可權服務設計解析
- 怎麼控制報表的資料許可權
- 『學了就忘』Linux許可權管理 — 55、檔案特殊許可權Linux
- PingCode Wiki 許可權設計之ACLGC
- 資料分析的許可權控制
- 資料庫的許可權管理資料庫
- win10使用者許可權管理資料夾怎麼設定_win10資料夾完全控制許可權操作方法Win10
- vue要做許可權管理該怎麼做?如果控制到按鈕級別的許可權怎麼做?Vue
- win10 建資料夾許可權方法 如何設定windows10檔案許可權Win10Windows
- 選單許可權和按鈕許可權設定
- SpringSecurity許可權管理系統實戰—九、資料許可權的配置SpringGse
- 『學了就忘』Linux許可權管理 — 56、不可改變位許可權(chattr)Linux
- PostgreSQL物件許可權如何在後設資料中獲取-許可權解讀、定製化匯出許可權SQL物件
- 【專案實踐】一文帶你搞定頁面許可權、按鈕許可權以及資料許可權
- 許可權安全管控的設計想法
- 基於RBAC的許可權設計模型模型
- win10資料夾管理員許可權如何更改_win10設定資料夾管理員許可權步驟Win10
- 基於RBAC做資料許可權
- linux 檔案、資料夾許可權Linux
- 修改檔案、資料夾許可權
- 資料庫學習:許可權管理資料庫
- 往hdfs寫資料無許可權
- Mysql資料庫許可權問題MySql資料庫
- 資料許可權技術驗證
- 資料許可權驗證MyBatis版MyBatis