在 RuoYi 系统中,判断某个用户的数据权限主要通过以下几个步骤来实现:
1. 获取用户的角色和部门信息
首先,系统需要获取用户的基本信息,包括用户所拥有的角色和用户所属的部门。RuoYi 通常会在用户登录后,将这些信息存储在用户的会话或 token 中。
// 获取当前用户
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
2. 确定角色的权限范围
每个角色在系统中都会有一个数据权限范围(data scope),这个范围定义了用户可以访问的数据范围。通常数据权限范围有以下几种:
- 全部数据权限
- 自定义数据权限
- 本部门数据权限
- 本部门及以下数据权限
- 仅本人数据权限
通过角色,可以确定当前用户的数据权限类型。
3. 判断具体的数据权限类型
系统通过判断用户角色的数据权限类型,来确定用户的实际数据访问范围。以下是不同数据权限类型的判断逻辑:
-
全部数据权限:用户可以访问系统中的所有数据,不需要额外的过滤条件。
-
自定义数据权限:用户可以访问指定的部门或数据集。系统会根据用户的角色配置,确定用户可以访问的具体部门或数据集。
-
本部门数据权限:系统只允许用户访问其所在部门的数据。通常在 SQL 查询中,会添加
WHERE
条件,限制数据只能来自用户所在的部门。 -
本部门及以下数据权限:系统允许用户访问其所在部门及其下属部门的数据。这种情况需要递归查询部门结构,并在 SQL 查询中增加相应的
WHERE
条件。 -
仅本人数据权限:用户只能访问与自己相关的数据。通常会在 SQL 查询中添加
user_id = currentUser.getUserId()
这样的条件。
4. 数据权限的 SQL 动态拼接
通过 @DataScope
注解来动态拼接 SQL 中的数据权限过滤条件。RuoYi 的 DataScopeAspect
切面类会拦截标注了 @DataScope
的方法,然后根据当前用户的数据权限范围拼接合适的 SQL 条件。
@Aspect
@Component
public class DataScopeAspect {
@Around("@annotation(dataScope)")
public Object around(ProceedingJoinPoint point, DataScope dataScope) throws Throwable {
// 获取当前用户的角色
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
// 获取用户的数据权限
String dataScopeSql = getDataScopeSql(currentUser);
// 动态拼接SQL条件
DataScopeContextHolder.setDataScopeSql(dataScopeSql);
try {
return point.proceed();
} finally {
DataScopeContextHolder.clearDataScopeSql();
}
}
private String getDataScopeSql(SysUser user) {
// 根据用户角色的权限范围,拼接SQL过滤条件
// 返回对应的 SQL 片段,如 " AND dept_id IN (1,2,3)" 等
}
}
5. 自定义扩展
如果你的业务需求复杂,需要更加细粒度或自定义的数据权限判断逻辑,你可以扩展 DataScopeAspect
或者自定义自己的数据权限判断逻辑,将它们整合到系统中。
通过这种方式,RuoYi 系统可以根据用户的角色和部门信息,动态判断并应用相应的数据权限,确保用户只能访问其权限范围内的数据。