數據權限控制

1. 數據權限是什么?

在講數據權限之前,要先說一下功能權限;功能權限一般的管理后臺系統(tǒng)都會涉及到;即:某個人擁有什么角色,可以對哪些資源進行操作;
數據權限和功能權限一樣,也是一種對資源的保護;數據權限又可以分為“橫向權限”和“縱向權限”

橫向權限:即對數據行級別的限制

例如:角色A可以查看全部數據;角色B只能查看50條數據;

縱向權限:即數據列級別的限制

例如:角色C可以查看所有列,角色D只能查看3列數據

2. 數據權限如何設計?

個人理解:
既然數據權限和功能權限一樣,那么權限表(permission)里就可以創(chuàng)建一條數據,類型定義為“數據權限”,至于數據規(guī)則的具體邏輯可以單獨用一個表(data_rule)存儲,然后data_rule 表里面引入permission表 Id字段
具體執(zhí)行邏輯:

  1. 用戶訪問一個資源
  2. 判斷該用戶是否有權限訪問該資源(即:功能權限)
  3. 如果可以訪問,判斷該接口是否啟用了數據權限規(guī)則
  4. 如果啟用數據規(guī)則,獲取該用戶擁有的角色,通過角色獲取數據規(guī)則權限
  5. 通過數據規(guī)則,動態(tài)修改查詢SQL
  6. 執(zhí)行SQL,返回結果;
    以上邏輯是否覺得有哪塊不對?
    在第四步的時候,通過角色獲取數據規(guī)則,數據規(guī)則可能有多個,那應該怎么處理?
    例如:
    1)一個用戶是銷售經理, 他可以看他以及他下屬的銷售業(yè)績; 對應一條數據權限1
    2)查看客戶信息時,他能查看他下屬的客戶信息; 對應一條數據權限2
    當用戶訪問銷售業(yè)績的時候,如果按照之前的理論,應該會得到兩條數據權限;但是這并不是我們想要的,我們只想得到數據權限1就可以。所以數據權限應該是與接口對應的,即:數據權限作用在哪個具體的接口上,這樣當我們獲取到2條數據權限時,通過接口URL進行過濾,就可以找到只屬于這個接口的數據權限了;

3. 開源框架jeecg-boot 是如何做的?

下圖是jeecgboot 表設計的大致:


圖片.png

jeecg-boot框架里面的具體邏輯:

  1. 在使用數據權限的接口上用自定義注解@PermissionData標識
  2. 編寫一個切面類PermissionDataAspect,攔截@PermissionData標識的接口
  3. 當用戶訪問一個帶有注解PermissionData的接口,首先會進入PermissionDataAspect類,該類的主要作用就是通過接口URL獲取作用在這條接口上的數據權限,然后把數據權限(即:數據規(guī)則)保存到上下文中。
  4. 當進入到真正的接口中時,獲取數據規(guī)則,通過數據規(guī)則動態(tài)生成Sql語句。
  5. 執(zhí)行sql 并返回結果
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容