1. 數(shù)據(jù)權(quán)限是什么?
在講數(shù)據(jù)權(quán)限之前岩臣,要先說一下功能權(quán)限宵膨;功能權(quán)限一般的管理后臺系統(tǒng)都會涉及到炸宵;即:某個(gè)人擁有什么角色,可以對哪些資源進(jìn)行操作捎琐;
數(shù)據(jù)權(quán)限和功能權(quán)限一樣,也是一種對資源的保護(hù)末秃;數(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è)計(jì)哑梳?
個(gè)人理解:
既然數(shù)據(jù)權(quán)限和功能權(quán)限一樣,那么權(quán)限表(permission)里就可以創(chuàng)建一條數(shù)據(jù)悯仙,類型定義為“數(shù)據(jù)權(quán)限”吠卷,至于數(shù)據(jù)規(guī)則的具體邏輯可以單獨(dú)用一個(gè)表(data_rule)存儲,然后data_rule 表里面引入permission表 Id字段
具體執(zhí)行邏輯:
- 用戶訪問一個(gè)資源
- 判斷該用戶是否有權(quán)限訪問該資源(即:功能權(quán)限)
- 如果可以訪問偎捎,判斷該接口是否啟用了數(shù)據(jù)權(quán)限規(guī)則
- 如果啟用數(shù)據(jù)規(guī)則序攘,獲取該用戶擁有的角色,通過角色獲取數(shù)據(jù)規(guī)則權(quán)限
- 通過數(shù)據(jù)規(guī)則丈牢,動(dòng)態(tài)修改查詢SQL
- 執(zhí)行SQL瞄沙,返回結(jié)果;
以上邏輯是否覺得有哪塊不對?
在第四步的時(shí)候申尼,通過角色獲取數(shù)據(jù)規(guī)則垫桂,數(shù)據(jù)規(guī)則可能有多個(gè),那應(yīng)該怎么處理霹粥?
例如:
1)一個(gè)用戶是銷售經(jīng)理, 他可以看他以及他下屬的銷售業(yè)績庙曙; 對應(yīng)一條數(shù)據(jù)權(quán)限1
2)查看客戶信息時(shí)浩淘,他能查看他下屬的客戶信息; 對應(yīng)一條數(shù)據(jù)權(quán)限2
當(dāng)用戶訪問銷售業(yè)績的時(shí)候男旗,如果按照之前的理論欣鳖,應(yīng)該會得到兩條數(shù)據(jù)權(quán)限;但是這并不是我們想要的什荣,我們只想得到數(shù)據(jù)權(quán)限1就可以怀酷。所以數(shù)據(jù)權(quán)限應(yīng)該是與接口對應(yīng)的蜕依,即:數(shù)據(jù)權(quán)限作用在哪個(gè)具體的接口上,這樣當(dāng)我們獲取到2條數(shù)據(jù)權(quán)限時(shí)样眠,通過接口URL進(jìn)行過濾檐束,就可以找到只屬于這個(gè)接口的數(shù)據(jù)權(quán)限了;
3. 開源框架jeecg-boot 是如何做的被丧?
下圖是jeecgboot 表設(shè)計(jì)的大致:
jeecg-boot框架里面的具體邏輯:
- 在使用數(shù)據(jù)權(quán)限的接口上用自定義注解@PermissionData標(biāo)識
- 編寫一個(gè)切面類PermissionDataAspect甥桂,攔截@PermissionData標(biāo)識的接口
- 當(dāng)用戶訪問一個(gè)帶有注解PermissionData的接口黄选,首先會進(jìn)入PermissionDataAspect類,該類的主要作用就是通過接口URL獲取作用在這條接口上的數(shù)據(jù)權(quán)限,然后把數(shù)據(jù)權(quán)限(即:數(shù)據(jù)規(guī)則)保存到上下文中。
- 當(dāng)進(jìn)入到真正的接口中時(shí)蜂嗽,獲取數(shù)據(jù)規(guī)則殃恒,通過數(shù)據(jù)規(guī)則動(dòng)態(tài)生成Sql語句。
- 執(zhí)行sql 并返回結(jié)果