使用 HZERO 数据权限
数据权限的目的是为了控制用户的可访问数据的功能。
数据权限提供在系统使用过程中,能够实时、动态、灵活的调整用户、角色或者其他维度的可访问数据。
数据权限基于表来进行权限控制,可以添加其他更细的条件来控制权限控制范围,例如可以通过服务、租户等条件来做过滤。
数据权限功能主要分为两个模块,一个是权限控制范围,一个是权限控制规则,在 中切换两个功能。
中切换两个功能。
- 菜单路径:系统管理 > 数据权限
权限规则

字段说明:
| 字段名称 | 字段描述 | 必输 | 可修改 | 
|---|---|---|---|
| 租户 | 权限规则所属租户 | 是 | 否 | 
| 规则编码 | 权限规则的唯一标识 | 是 | 否 | 
| 规则名称 | 权限规则的名称 | 是 | 否 | 
| 规则类型 | 可选 SQL和数据库前缀两种规则 | 是 | 是 | 
| SQL | 替换的SQL内容或者数据库前缀 | 是 | 是 | 
| 状态 | 启用和禁用两种状态,当为禁用时不能使用该权限规则 | 否 | 是 | 
| 描述 | 权限规则的的描述信息 | 否 | 是 | 
权限范围列表

列表字段:
| 字段名称 | 字段描述 | 必输 | 可修改 | 
|---|---|---|---|
| 租户 | 权限范围所属租户 | 是 | 否 | 
| 权限表名 | 限定范围,确定到具体表 | 是 | 是 | 
| SQLID | Sql的全限定名,默认Mapper查询接口的 package.ClassName.methodName | 否 | 是 | 
| 服务名 | 仅在指定服务内生效,如果不指定则全局生效 | 否 | 是 | 
| 状态 | 启用和禁用两种状态。当为禁用时不能使用该权限范围 | 否 | 是 | 
| 自定义规则标识 | SQL是否支持自定义SQL拼接,即在代码中自己传入要注入的SQL。默认为否 | 否 | 是 | 
| 描述 | 权限范围的描述信息 | 否 | 是 | 
数据权限应用
定义好数据权限规则和范围之后,在权限范围编辑页面可以将权限规则和权限范围进行关联。

数据权限处理过程主要分为表前缀和SQL,例如现在有一个屏蔽范围拦截hpfm_tenant这张表,然后规则类型是表前缀,例如hzero-platform,那么SQL的转换为:
-- 原Sql
SELECT * FROM hpfm_tenant
-- 执行SQL
SELECT * FROM hzero_platform.hpfm_tenant
如果规则类型是SQL,例如tenant_num like 'HZERO%',那么SQL的转换为:
-- 原Sql
SELECT * FROM hpfm_tenant
-- 执行SQL
SELECT * FROM (SELECT * FROM hpfm_tenant WHERE tenant_num like 'HZERO%') T
数据权限规则的SQL中支持参数替换,支持的参数主要分为一下几种:
| 参数格式 | 描述 | 示例 | 
|---|---|---|
| #{上下文参数} | 当前SQL执行时传入 MyBatis Mapper 的参数 | xxx_id = #{xxxId} | 
| #{当前用户信息} | 当前 DetailsHelper.getUserDetails()返回对象内的参数 | role_id = #{roleId} | 
| #{tableAlias} | 拦截表的表别名 | #{tableAlias}.column1 | 
| #{roleMergeIds} | 如果开启角色合并,返回合并角色列表,如果没有开启,返回当前角色,多个以逗号分隔 | role_id in (#{roleMergeIds}) | 
数据权限常见问题
- 数据权限使用第三方的SQL解析工具,该工具不支持数据库方言,即无法解析方言SQL,会导致数据权限功能失效。
- 数据权限应用时所有操作都通过Redis缓存进行,所以要保证平台服务和应用服务的Redis使用的时同一个,而且直接写入数据库的数据是无法生效的,需要重启平台服务或者在页面上重新保存一下