数字化系统中常常遇到一些数据权限的需求,比如希望将用户分组,将不同组的数据隔离开。
本文描述的是关于这种需求的一种实现方案。
ADS说明
Application Data Shield (ADS)是我开源的一个框架,核心思想是,将数据实体用某个字段标记,这个字段可以驱动ADS,来对数据进行分割,保护。ADS可以用来实现多种功能,比如数据权限。
例如如下数据表:
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,用户可以通过简单的配置实现一些功能,如数据权限,多租户等等。
以下通过ADS实现数据权限功能,代码请见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 这个实例要实现的功能是,把用户具有权限的class id列表提供给ADS
-
实现
AdsManagerConfigurer
接口,配置ADS代码见org.ads.test.ads.AdsCustomConfigurer 1,2两步实现的组件需要通过这个配置注册到ADS
-
注册mybatis plus插件
代码见org.ads.test.MybatisPlusConfiguration 通过MybatisPlus的插件功能,把ADS插件注册到Mybatis Plus中
-
在配置文件中使用ADS
# 代码见application.yaml ads: # ads 默认为关闭状态 enabled: true data-shields: # 配置class_material表的data shield class_material: driver-type: CLASS column-name: class_id
经过如上配置,ADS就配置好了,可以运行测试用例org.ads.test.SimpleTest#should_see_personal_class_materials 查看效果:
Amy属于1班,当Amy登录系统,她只能看到1班的数据。
以上就是基于ADS实现数据权限的方法,对于复杂的场景,这里没有演示,但ADS基于其底层思想,支持各种复杂的场景,欢迎使用,贡献代码。