目录
Ruoyi是一个基于Spring Boot和Vue.js的开源后台管理系统,内置了强大的权限管理系统,而Spring AOP则是Spring框架的一个核心特性,用于处理横切关注点,如权限控制。
一:数据权限展示
首先拉起ruoyi打开系统管理 -> 角色管理 -> 数据权限
我们可以通过分配角色,对数据权限进行控制。
二、数据权限作用及操作
-
保障数据安全: 通过数据权限控制,系统可以确保用户只能访问其被授权的数据,防止未经授权的用户获取敏感信息。
-
隔离数据: 数据权限可以用来隔离不同用户、不同部门或角色之间的数据,确保数据的完整性和保密性。
-
合规性: 对于一些需要符合法规和合规性要求的系统,数据权限可以帮助系统管理员确保数据的合法使用。
例如:在用户管理中,用户admin可以看到的数据如下
而用户ry能看到的数据为
用户admin 的角色为超级管理员,超级管理员设置为具有访问全部数据权限
用户ry 的角色为普通角色,普通角色设置为只有访问本部门数据权限,其所属部门为测试部门
数据权限操作-权限控制类型
三、数据权限后端源码分析
3.1 controller层:
controller层比较简单就是通过处理"/list"路径的GET请求,在权限验证通过后,通过userService
查询用户列表,并将查询结果封装成一个分页信息对象返回给前端。
3.2 Service层:
3.3 Mapper层:
Java Mapper
xml Mapper
若依在进行数据权限的访问时,Mapper层中对数据进行处理,根据用户角色的权限对数据进行过滤。可以看到倒数第二行${params.dataScope}就是对数据范围进行过滤。
那么这个时候我们就要思考${params.dataScope}是在做什么,为什么可以进行数据过滤?
3.4 确定接口和相关代码:
函数调用链:doBefore -> handleDataScope -> dataScopeFilter 添加SQL 语句
接下来我们可以引出我们最后的主角了——AOP 类DataScopeAspect 处理注解@DataScope
根据当前登录用户的信息,判断是否为超级管理员,如果不是,则调用dataScopeFilter
方法进行数据权限过滤。这种机制通常用于确保只有非管理员用户才会受到数据权限的约束,管理员用户可以访问所有数据。
接下来我们分析一下AOP 类DataScopeAspect 对于全部权限、自定义权限、本部门及以下权限、仅本人权限最终添加的SQL 语句及作用
-
全部权限(DATA_SCOPE_ALL):
- SQL语句:
""
(空字符串) - 作用:表示用户具有全部数据的访问权限,不需要添加任何过滤条件,即不进行数据权限的过滤。
- SQL语句:
-
自定义权限(DATA_SCOPE_CUSTOM):
- SQL语句:动态生成类似
OR d.dept_id IN (SELECT dept_id FROM sys_role_dept WHERE role_id = X)
的条件,X为角色ID。 - 作用:根据用户的角色,查询出与该角色相关的部门数据,仅允许用户访问与这些部门相关的数据。
- SQL语句:动态生成类似
-
本部门权限(DATA_SCOPE_DEPT):
- SQL语句:动态生成类似
OR d.dept_id = X
的条件,X为用户所属部门ID。 - 作用:限制用户只能访问自己所在部门的数据,不包括子部门的数据。
- SQL语句:动态生成类似
-
本部门及以下权限(DATA_SCOPE_DEPT_AND_CHILD):
- SQL语句:动态生成类似
OR d.dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = X or find_in_set(X, ancestors))
的条件,X为用户所属部门ID。 - 作用:允许用户访问自己所在部门及其所有子部门的数据。
- SQL语句:动态生成类似
-
仅本人权限(DATA_SCOPE_SELF):
- SQL语句:动态生成类似
OR u.user_id = X
的条件,X为用户ID。 - 作用:限制用户只能访问自己的数据。
- SQL语句:动态生成类似
这些SQL语句会在实际查询数据库之前动态地加入到原始的SQL查询语句中,从而确保用户在执行查询操作时受到相应的数据权限约束。此切面在目标方法执行前会拦截,检查用户的角色和数据权限配置,然后根据不同的权限类型生成相应的SQL条件。