开发喵星球

RuoYi-Vue-Plus 数据权限功能详解(323)

可参考 demo 模块的用法(需先导入 test.sql 文件)。

数据权限的最新功能

  1. 支持自动注入 SQL 数据过滤机制。
  2. 针对查询、更新、删除操作进行限制。
  3. 支持自定义数据字段的过滤设置。
  4. 模板支持 spel 语法,方便动态处理 Bean
  5. 可以与菜单权限标识符联合使用(新增于 5.2.X 版本)。

数据权限的相关类及功能

类名 描述 主要功能
DataScopeType 数据权限模板定义 用于定义数据权限的模板
DataPermission 数据权限组注解 标注此注解开启数据权限过滤(默认按部门过滤)
DataColumn 数据权限字段注解 用于替换数据权限模板中的 key 变量
PlusDataPermissionInterceptor 数据权限 SQL 拦截器 拦截 SQL 语句并检查是否启用了 DataPermission 注解
PlusDataPermissionHandler 数据权限处理器 为拦截到的 SQL 添加数据权限过滤条件
DataPermissionHelper 数据权限辅助工具 操作数据权限上下文
SysDataScopeService 自定义 Bean 用于数据权限 处理自定义数据权限的扩展功能

如何忽略数据权限

  1. 如需对特定 SQL 禁用数据权限过滤,可在对应 Mapper 接口上添加如下注解:
@InterceptorIgnore(dataPermission = "true")
  1. 如果需要在业务逻辑层忽略数据权限过滤,可以调用以下方法:
// 无返回值
DataPermissionHelper.ignore(() -> { 执行业务逻辑 });

// 有返回值
Class result = DataPermissionHelper.ignore(() -> { return 业务逻辑 });

使用方式说明参考demo模块

数据权限体系结构为:用户 -> 多角色 -> 角色 -> 单数据权限

例如,用户A拥有两个角色:
– 角色A:部门经理,可以查看本部门及下属部门的数据。
– 角色B:兼职开发,只能查看自己的数据。

创建角色 test1,权限为本部门及下属部门:

创建角色 test2,权限为仅本人:

将角色分配给用户 test

列表查询编写说明

在 Mapper 层使用数据权限注解,dept_id 用于过滤部门字段,user_id 用于过滤用户字段。

查询注解示例

注意事项

如果方法中有自定义的实现,最终执行的 mapper 方法不是标注该方法的 mapper,则数据权限注解将不会生效。

解决方法:找到实际执行的 mapper 并对其进行重写。

无效情况解决方案

编写数据权限模板

数据权限模板

  1. code 字段用于关联角色的数据权限。
  2. sqlTemplate 为 SQL 模板:
    • #{#deptName}:模板变量,匹配权限注解的 key
    • #{@sdss}:调用 Bean 方法处理模板。
  3. elseSql 为兜底 SQL 处理:当角色没有匹配权限时,将其设置为 1 = 0,以禁止数据访问。

如何自定义 SQL 模板

  1. 角色管理 中的 数据权限 下拉菜单中添加自定义模板。

自定义模板添加

  1. 代码中,使用 DataScopeType 自定义 SQL 模板。

自定义 SQL 模板

  1. 标注权限注解。

权限注解示例

  1. 设置数据权限变量。

数据权限变量设置

  1. 测试结果显示在控制台:
Execute SQL: SELECT * FROM test_demo WHERE (test_key LIKE '%测试数据%') LIMIT 10

支持类级别的权限标注

规则:方法级注解优先于类级注解。类级别标注后,所有方法(包括继承自父类的方法)都会进行数据权限过滤。

类级别标注示例

   
分类:Java/OOP 作者:无限繁荣, 吴蓉 发表于:2024-09-04 11:34:21 阅读量:191
<<   >>


powered by kaifamiao