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

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