在 RuoYi 系统中,如何判断某个用户的数据权限的

在 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 系统可以根据用户的角色和部门信息,动态判断并应用相应的数据权限,确保用户只能访问其权限范围内的数据。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值