在常规开发中权限控制通常聚焦于两点前端组件显示控制菜单、按钮的可见性后端接口访问控制用户能否调用指定 URL。但这两种权限控制的核心局限在于它们管控的是不同的对象如组件 A 与组件 B、接口 A 与接口 B无法解决同一对象内的数据隔离问题。实际业务中存在这类痛点所有用户数据存储在同一张表中要求不同部门的用户只能查看本部门数据。此时同一查询接口、同一条 SQL需要根据用户身份返回不同结果而菜单权限无法实现这一需求因此数据权限的引入成为必然。一、问题引入为什么需要数据权限在常规开发中我们对权限的控制通常体现在两个方面 前端组件显示控制菜单或按钮的显隐 。后端接口访问控制用户是否有权请求某个 URL 。但这两种方式有一个共同特点它们针对的往往不是同一个对象比如组件 A 和组件 B接口 A 和接口 B。现在的痛点是 我们要针对同一个对象例如“用户表”里的数据进行控制 。假设所有用户数据都存在同一张表中需求是不同部门的用户只能看到自己部门的数据 。如果仅仅使用菜单权限无法解决“同一个接口list、同一个 SQL却要返回不同结果”的问题。这就需要引入数据权限。二、 解决方案与现象展示RuoYi 框架通过在“角色管理”中配置“数据范围”来解决这个问题。1.配置数据权限管理员进入【系统管理 - 角色管理】可以为角色分配不同的数据权限范围 2. 实际效果假设我们有两个用户admin超级管理员拥有全部数据权限 。ry普通角色隶属于测试部门仅拥有本部门数据权限 。当他们分别访问同一个【用户管理】页面时admin 能看到研发部门、测试部门等所有公司的用户数据 。ry 只能看到测试部门的 1 条数据其他数据被自动过滤 。数据权限的本质其实就是修改 SQL 语句 。RuoYi 利用 AOP面向切面编程和 MyBatis 的动态 SQL 能力实现了这一过程的自动化。3.后端源码分析第1步Controller 发起请求第2步进入 Service 实现类第3步AOP 切面拦截核心当调用带有 DataScope 注解的方法时DataScopeAspect.java 会拦截第4步handleDataScope 方法处理第5步dataScopeFilter 生成SQL条件第6步进入 Mapper 执行SQL第7步XML 中的 SQL 拼接总结流程图总结RuoYi 的数据权限实现是 AOP 动态 SQL 的经典应用。作用限制同一类型数据的不同行 。操作给角色配置数据权限给用户分配角色 。原理Service 层使用 DataScope 定义别名 。Aspect 层根据注解和用户信息动态生成 SQL 过滤片段 。Mapper 层通过 ${params.dataScope} 将过滤条件注入 SQL 。通过这种方式我们不仅实现了灵活的权限控制还将权限逻辑与业务逻辑彻底解耦极大地提高了代码的可维护性。车间的设备数据设计数据权限1.创建设备实体类 Equipment.java2.创建设备Mapper接口 IEquipmentMapper.java3.创建设备Mapper XML配置文件4.创建设备Service接口 IEquipmentService.java5.创建设备Service实现类 EquipmentServiceImpl.java6.创建设备Controller控制器7.创建数据库建表SQL脚本演示分配菜单权限和数据权限给普通角色超级用户赋予普通用户一定的权限安装位置数据没给授权那么ry用户哪里就不会显示如果超级用户没给予车间权限ry用户不会显示
从原理到源码解析数据权限控制
发布时间:2026/5/28 7:40:28
在常规开发中权限控制通常聚焦于两点前端组件显示控制菜单、按钮的可见性后端接口访问控制用户能否调用指定 URL。但这两种权限控制的核心局限在于它们管控的是不同的对象如组件 A 与组件 B、接口 A 与接口 B无法解决同一对象内的数据隔离问题。实际业务中存在这类痛点所有用户数据存储在同一张表中要求不同部门的用户只能查看本部门数据。此时同一查询接口、同一条 SQL需要根据用户身份返回不同结果而菜单权限无法实现这一需求因此数据权限的引入成为必然。一、问题引入为什么需要数据权限在常规开发中我们对权限的控制通常体现在两个方面 前端组件显示控制菜单或按钮的显隐 。后端接口访问控制用户是否有权请求某个 URL 。但这两种方式有一个共同特点它们针对的往往不是同一个对象比如组件 A 和组件 B接口 A 和接口 B。现在的痛点是 我们要针对同一个对象例如“用户表”里的数据进行控制 。假设所有用户数据都存在同一张表中需求是不同部门的用户只能看到自己部门的数据 。如果仅仅使用菜单权限无法解决“同一个接口list、同一个 SQL却要返回不同结果”的问题。这就需要引入数据权限。二、 解决方案与现象展示RuoYi 框架通过在“角色管理”中配置“数据范围”来解决这个问题。1.配置数据权限管理员进入【系统管理 - 角色管理】可以为角色分配不同的数据权限范围 2. 实际效果假设我们有两个用户admin超级管理员拥有全部数据权限 。ry普通角色隶属于测试部门仅拥有本部门数据权限 。当他们分别访问同一个【用户管理】页面时admin 能看到研发部门、测试部门等所有公司的用户数据 。ry 只能看到测试部门的 1 条数据其他数据被自动过滤 。数据权限的本质其实就是修改 SQL 语句 。RuoYi 利用 AOP面向切面编程和 MyBatis 的动态 SQL 能力实现了这一过程的自动化。3.后端源码分析第1步Controller 发起请求第2步进入 Service 实现类第3步AOP 切面拦截核心当调用带有 DataScope 注解的方法时DataScopeAspect.java 会拦截第4步handleDataScope 方法处理第5步dataScopeFilter 生成SQL条件第6步进入 Mapper 执行SQL第7步XML 中的 SQL 拼接总结流程图总结RuoYi 的数据权限实现是 AOP 动态 SQL 的经典应用。作用限制同一类型数据的不同行 。操作给角色配置数据权限给用户分配角色 。原理Service 层使用 DataScope 定义别名 。Aspect 层根据注解和用户信息动态生成 SQL 过滤片段 。Mapper 层通过 ${params.dataScope} 将过滤条件注入 SQL 。通过这种方式我们不仅实现了灵活的权限控制还将权限逻辑与业务逻辑彻底解耦极大地提高了代码的可维护性。车间的设备数据设计数据权限1.创建设备实体类 Equipment.java2.创建设备Mapper接口 IEquipmentMapper.java3.创建设备Mapper XML配置文件4.创建设备Service接口 IEquipmentService.java5.创建设备Service实现类 EquipmentServiceImpl.java6.创建设备Controller控制器7.创建数据库建表SQL脚本演示分配菜单权限和数据权限给普通角色超级用户赋予普通用户一定的权限安装位置数据没给授权那么ry用户哪里就不会显示如果超级用户没给予车间权限ry用户不会显示