1. 數據權限是什么?
在講數據權限之前,要先說一下功能權限;功能權限一般的管理后臺系統(tǒng)都會涉及到;即:某個人擁有什么角色,可以對哪些資源進行操作;
數據權限和功能權限一樣,也是一種對資源的保護;數據權限又可以分為“橫向權限”和“縱向權限”
橫向權限:即對數據行級別的限制
例如:角色A可以查看全部數據;角色B只能查看50條數據;
縱向權限:即數據列級別的限制
例如:角色C可以查看所有列,角色D只能查看3列數據
2. 數據權限如何設計?
個人理解:
既然數據權限和功能權限一樣,那么權限表(permission)里就可以創(chuàng)建一條數據,類型定義為“數據權限”,至于數據規(guī)則的具體邏輯可以單獨用一個表(data_rule)存儲,然后data_rule 表里面引入permission表 Id字段
具體執(zhí)行邏輯:
- 用戶訪問一個資源
- 判斷該用戶是否有權限訪問該資源(即:功能權限)
- 如果可以訪問,判斷該接口是否啟用了數據權限規(guī)則
- 如果啟用數據規(guī)則,獲取該用戶擁有的角色,通過角色獲取數據規(guī)則權限
- 通過數據規(guī)則,動態(tài)修改查詢SQL
- 執(zhí)行SQL,返回結果;
以上邏輯是否覺得有哪塊不對?
在第四步的時候,通過角色獲取數據規(guī)則,數據規(guī)則可能有多個,那應該怎么處理?
例如:
1)一個用戶是銷售經理, 他可以看他以及他下屬的銷售業(yè)績; 對應一條數據權限1
2)查看客戶信息時,他能查看他下屬的客戶信息; 對應一條數據權限2
當用戶訪問銷售業(yè)績的時候,如果按照之前的理論,應該會得到兩條數據權限;但是這并不是我們想要的,我們只想得到數據權限1就可以。所以數據權限應該是與接口對應的,即:數據權限作用在哪個具體的接口上,這樣當我們獲取到2條數據權限時,通過接口URL進行過濾,就可以找到只屬于這個接口的數據權限了;
3. 開源框架jeecg-boot 是如何做的?
下圖是jeecgboot 表設計的大致:

圖片.png
jeecg-boot框架里面的具體邏輯:
- 在使用數據權限的接口上用自定義注解@PermissionData標識
- 編寫一個切面類PermissionDataAspect,攔截@PermissionData標識的接口
- 當用戶訪問一個帶有注解PermissionData的接口,首先會進入PermissionDataAspect類,該類的主要作用就是通過接口URL獲取作用在這條接口上的數據權限,然后把數據權限(即:數據規(guī)則)保存到上下文中。
- 當進入到真正的接口中時,獲取數據規(guī)則,通過數據規(guī)則動態(tài)生成Sql語句。
- 執(zhí)行sql 并返回結果