Pear Admin Pro 1.1.1 发布,零侵入式多租户,数据规则权限
项目简介:
1.基于 Spring 实现的通用权限管理平台(RBAC模式)。整合最新技术高效快速开发,前后端分离模式,开箱即用。
2.核心模块包括:用户、角色、职位、组织机构、菜单、字典、日志、多应用管理、文件管理、定时任务等功能。
3.代码量少、学习简单、功能强大、轻量级、易扩展,轻松开发从现在开始!
项目地址:前往
更新内容:
[新增] @DataScope 注解 rules 属性,支持 数据权限 规则配置模式
[新增] Parameter validation 参数验证
[新增] Tenant 拦截器,基于 tenant_id 的逻辑数据隔离
[新增] TenantConstant 静态配置
[新增] ExcelUtil 读写 Excel 方法,增加
[修复] DataScopeInterceptor 拦截 Auto 模式,分页失败
[优化] 抽象 Invocation 的相关操作到 InvocationHandler
本次更新,主要解决 数据权限 使用的不足,推出的规则模式,高度自定义的数据过滤方式
应用场景:
例如,存在订单列表 与 消息列表,有 两个 角色 admin (管理员) 与 user (用户),管理员 对 订单列表 的查询范围 为 全部, 对消息列表 的查询范围 为自己,用户 对 订单列表 的查询范围为 仅自己,对 消息列表 的查询范围同样为 仅自己
简单归纳:不同服务 在 不同角色 访问时 给予不同 的 可见范围
在之前的版本中,此业务只能通过 自定义 mapper 的方式去实现业务,本次更新 解决了 自定义 mapper 繁琐,使用 @DataScopeRule 注解开发该类业务
核心支持:
@DataScope 权限注解
@DataScopeRule 规则注解
简单示例:
声明 mapper 实现,查询所有订单
<select id="selectOrder" resultType="SysOrder">select * from sys_order</select>
定义 mapper 接口,查询所有订单
public List<SysOrder> selectOrder();
可以看到以上代码,为查询所有订单,并未加入过滤条件
如果我们想要,实现 admin (管理员) 查询所有订单,user (用户) 查询自己的订单,应该怎么做呢?
修改 mapper 接口如下:
@DataScope(rules = {@DataScopeRule(role="admin", scope=Scope.ALL),@DataScopeRule(role="user", scope=Scope.SELF)})public List<SysOrder> selectOrder();
详解:
@DataScope 注解标注的接口,会被 Interceptor 拦截,进行相应的权限处理
@DataScope 中的 rules 属性,权限规则,即 规定 角色 对应 的查询范围
@DataScopeRule 为 规则 的载体,用于配置 角色 与 权限的映射,role 属性为 角色 的 code 标识,scope 为 数据权限的枚举
修改后的 mapper 可以翻译为 :
管理员 查询时,返回所有订单信息,用户 查询时,返回自己发起的订单
解析 :
原 SQL 语句
select * from sys_order
管理员访问时,执行的 SQL 语句
select * from sys_order
用户访问时,执行的 SQL 语句
select * from (select * from sys_order) data a where a.create_by = 1
核心实现:DataScopeInterceptor
回顾:
指定模式:@DataScope 的 scope 属性,用于指定所有访问都采用该 查询范围
快速上手:
@DataScope(scope = Scope.DEPT)public List<SysMessage> selectMessage()
解析:所有访问者,都返回自己所在部门的订单信息
自动模式:scope 配置为 Scope.AUTO 时 , 所有访问的用户,采用该用户拥有的角色所配置的权限范围过滤,当存在多个时,重叠查询范围
快速上手:
@DataScope(scope = Scope.AUTO)public List<SysMessage> selectMessage()
解析:根据访问者,所拥有的角色对应的数据权限,返回相应范围的消息,当存在多个 角色 时,重叠返回
本次除 数据权限 的增强外,还提拱了对多租户的支持
多租户是指软件架构支持一个实例服务多个组织(Customer),每一个用户被称之为租户 (tenant),租户之间的数据是隔离的,并且保证每个用户的数据对其他租户不可见
由于共享开发和维护成本,对某些用户来说,多租户也是一种经济的解决方案。
在 Pro 中,我们是如何提供做租户的技术支持
开始使用:
TenantConstant 静态配置
/*** 开启多租户* */public static boolean enable = true;/*** 租户字段* */public static String TENANT_COLUMN = "tenant_id";/*** 忽略内容* */public static String IGNORE_TABLE[] = {}
1. enable : 启用多租户
修改 enable 为 true 后,项目全局启用多租户模式,所有的 Select Insert
Update 操作,将 扩展 对 tenant_id 的字段的关联
举例:
Enable 为 false 时:
select * from sys_user suinsert into sys_user (name,age) values("admin",18)update sys_user set name="admin" where name = "root"
Enable 为 true 时:
select * from sys_user su where su.tenant_id = 1insert into sys_user (name,age,tenant_id) values("admin",18,1)update sys_user set name="admin" where name = "root" and tenant_id=1
众所周知,在项目开发中,我们存在 sys_config,sys_tenant 等公共表,是不需要多租户过滤的,我们提供了 IGNORE_TABLE 配置
public static String IGNORE_TABLE[] = {"sys_config", "sys_tenant",};
在更复杂的业务中,如 Sys_user 表,需要全局开启多租户的数据隔离,但其中的某一个服务需要查询所有租户的数据,使用 @IgnoreTenant 注解,忽略该接口被多租户处理器处理
@IgnoreTenantList<SysUser> selectAll();