數(shù)字化系統(tǒng)中常常遇到一些數(shù)據(jù)權限的需求,比如希望將用戶分組,將不同組的數(shù)據(jù)隔離開。
本文描述的是關于這種需求的一種實現(xiàn)方案。
ADS說明
Application Data Shield (ADS)是我開源的一個框架,核心思想是,將數(shù)據(jù)實體用某個字段標記,這個字段可以驅動ADS,來對數(shù)據(jù)進行分割,保護。ADS可以用來實現(xiàn)多種功能,比如數(shù)據(jù)權限。
例如如下數(shù)據(jù)表:
create table if not exists class_material (
class_id int not null,
material_name varchar(255) not null
);
這是一張班級物品表,用此表來舉例解釋上面的意思:如果一個學生屬于班級1,那么他訪問到的只有班級1的物品,這是ADS的一種使用場景。
實例
ADS目前只有有mybatis plus springboot starter版本,基于這個starter,用戶可以通過簡單的配置實現(xiàn)一些功能,如數(shù)據(jù)權限,多租戶等等。
以下通過ADS實現(xiàn)數(shù)據(jù)權限功能,代碼請見https://github.com/player-sontan/ads-mp/tree/main/ads-mp-spring-boot-starter-example
配置ADS
-
定義
DriverType代碼見 org.ads.test.ads.cls.ClassDriver 如前文描述,DriverType是ADS的一種驅動,DriverType的名字是重要的,請查看application配置文件,其中用到了DriverType的名字 -
定義AssetsProvider
代碼見org.ads.test.ads.cls.ClassAssetsProvider 這個實例要實現(xiàn)的功能是,把用戶具有權限的class id列表提供給ADS -
實現(xiàn)
AdsManagerConfigurer接口,配置ADS代碼見org.ads.test.ads.AdsCustomConfigurer 1,2兩步實現(xiàn)的組件需要通過這個配置注冊到ADS -
注冊mybatis plus插件
代碼見org.ads.test.MybatisPlusConfiguration 通過MybatisPlus的插件功能,把ADS插件注冊到Mybatis Plus中 -
在配置文件中使用ADS
# 代碼見application.yaml ads: # ads 默認為關閉狀態(tài) enabled: true data-shields: # 配置class_material表的data shield class_material: driver-type: CLASS column-name: class_id
經(jīng)過如上配置,ADS就配置好了,可以運行測試用例org.ads.test.SimpleTest#should_see_personal_class_materials 查看效果:
Amy屬于1班,當Amy登錄系統(tǒng),她只能看到1班的數(shù)據(jù)。
以上就是基于ADS實現(xiàn)數(shù)據(jù)權限的方法,對于復雜的場景,這里沒有演示,但ADS基于其底層思想,支持各種復雜的場景,歡迎使用,貢獻代碼。