数据权限客户端
一、简介
1.1 概述
数据屏蔽客户端是平台服务数据屏蔽功能的客户端应用组件,旨在在微服务应用上拦截配置的全局
数据库表或特定SQL ID
下数据库表的SQL
拦截应用,以便在系统使用过程中去控制登录用户的数据权限。
1.2 原理
1.3 组件坐标
<dependency>
<groupId>org.hzero.boot</groupId>
<artifactId>hzero-boot-platform</artifactId>
<version>${hzero.boot.version}</version>
</dependency>
1.4 功能特性
- 使用简单,对代码无侵入性
- 屏蔽字段数据值,支持从Token对应的UserDetails中获取
- 屏蔽规则,优先获取租户定义的规则,获取不到取平台定义规则
- 支持对表增加数据库名前缀,支持跨DB查询
二、使用说明
2.1 常用配置
hzero:
data:
permission:
enabled: true # 启用(默认开启)
db-owner: ${HZERO_DB_OWNER:} # 默认数据库OWNER,如SqlServer需要配置dbo
2.2 基本使用
2.2.1 新建数据权限规则
如图所示,规则类型分为数据库前缀
和SQL
两种,SQL即为将要拼接在SQL中的条件,数据库前缀为拼在表前的数据库前缀名,用以支持跨DB查询。
2.2.2 数据权限规则占位符
数据权限规则中的SQL
字段,在不同的规则类型
下,可以通过不同的占位符
表达不同的动态意思。
SQL
- #{tenantId} 当前用户的当前租户id
- #{organizationId} 当前用户的所属租户id
- #{userId} 当前用户Id
- #{roleId} 当前用户的角色Id
数据库前缀
- #{tenantId} 当前用户在当前租户和当前服务下在数据库和数据源中所配置的数据库前缀
- #{服务名} 当前用户在当前租户和服务名下在在数据库和数据源中所配置的数据库前缀
2.2.3 新建数据权限范围
如图所示,权限范围含有租户,表名,SQLID,服务名,自定义规则标识等几个字段。
- 租户:租户即当前权限范围将要被应用在哪个租户上,HZERO平台表示对所有的租户生效。
- 表名:要被处理的表名。
- SQLID:对特定SQL中的表名进行处理,SQLID为namespace+id组成的全路径。
- 服务名:对特定的服务才生效,服务名为空表示对所有引入了平台服务组件且数据权限功能启用状态的服务生效。
- 自定义规则标识:对SQL是否支持自定义SQL拼接,即在代码中自己传入要注入的SQL。
2.2.4 权限范围应用继承关系
当权限范围中存在多个相同的表时,处理多个相同表名
的权限范围,返回应用层级最小
的数据权限信息,判断应用层级大小的规则如下:
tenantId > tenantId + serviceName > tenantId + sqlId > tenantId + serviceName + sqlId
2.2.5 数据权限选择权限规则
一个权限范围只能选择一个数据库前缀类型
的规则,可以选择多个SQL类型
的规则。
2.3 自定义规则
如果要使用自定义规则,首先需要在数据屏蔽范围维护页面上对对应的表开启自定义规则标识
,然后再在代码中使用PermissionDataHelper.startPermission方法
。具体使用如下:
// 假设hmdm_company表已经被维护了数据屏蔽范围,同时启用了自定义规则
// 定义一个map,key为表名,value为表所要自定义传入的sql
Map<String,String> tableSqlMap = new HashMap<>();
// sql值,具体sql怎么来可以自己拼
String sql = "xxx";
tableSqlMap.put("hmdm_company",sql);
// 调用自定义方法
PermissionDataHelper.startPermission(tableSqlMap);
return companyMapper.selectCompany();
- 支持在数据屏蔽中再客户化加入一层拦截器。可以从拦截器中获取被拦截的表以及将要被注入的sql。
public class TestInteceptor implements FilterSqlInterceptor{
/**
* 继承后重写此方法,可以修改数据屏蔽规则中将要被替换的规则
*/
public Map<Table,PermissionRangeVO> process(CustomUserDetails customUserDetails, Map<Table, PermissionRangeVO> currentFilterSqls){
...
}
}
三、定制化开发
数据屏蔽客户端顶层依赖于接口而非具体实现,使用者若对某一个接口有特殊需求,可重新实现接口并覆盖默认配置即可。
① PermissionSqlRepository
:数据屏蔽sql权限信息获取接口。
四、版本更新日志
版本 0.1.0-SNAPSHOT [2018-08-06]
- 第一个迭代版本,支持基于SQL ID + 表或表屏蔽配置
- 支持自定义屏蔽SQL传入支持。
版本 0.2.0-SNAPSHOT [2018-09-16]
- 第二个迭代版本,支持对表名增加数据库前缀,支持跨DB查询
版本 0.3.0-SNAPSHOT [2018-10-26]
- 第三个迭代版本,支持对From后面Where前面的子查询进行递归处理。
展望
- 支持替换表子查询、SQL语句后面拼接条件的方式实现过滤,以在不同的场景下提高性能