RuoYi-Vue-fast数据权限设计:行级权限与列级权限实现

RuoYi-Vue-fast数据权限设计:行级权限与列级权限实现

【免费下载链接】RuoYi-Vue-fast :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 【免费下载链接】RuoYi-Vue-fast 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-fast

在企业级应用开发中,数据权限控制是保障数据安全的核心环节。RuoYi-Vue-fast作为一款成熟的前后端分离权限管理系统,提供了精细化的数据权限解决方案,支持行级权限(Row-level Security)与列级权限(Column-level Security)的灵活配置。本文将深入剖析其实现机制,帮助开发人员快速掌握权限设计精髓。

数据权限架构概览

RuoYi-Vue-fast的数据权限体系基于RBAC(基于角色的访问控制)模型构建,通过注解驱动AOP切面实现权限规则的动态注入。核心实现集中在以下模块:

  • 权限注解DataScope定义权限控制范围
  • 切面处理DataScopeAspect负责动态拼接权限SQL
  • 角色配置SysRole实体存储数据权限策略

权限控制流程图

mermaid

行级权限实现机制

行级权限控制用户可访问的数据记录范围,系统预定义了五种权限策略,通过SysRole.dataScope字段标识:

权限编码权限名称适用场景
1全部数据权限系统管理员查看所有数据
2自定义数据权限多部门数据授权
3本部门数据权限部门负责人查看本部门数据
4本部门及以下数据权限层级管理场景
5仅本人数据权限普通用户仅查看个人创建数据

动态SQL拼接实现

核心逻辑在DataScopeAspect.dataScopeFilter()方法中实现,根据用户角色的数据权限动态生成过滤条件:

// 自定义数据权限SQL生成逻辑
if (DATA_SCOPE_CUSTOM.equals(dataScope)) {
    sqlString.append(StringUtils.format(
        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", 
        deptAlias, role.getRoleId()
    ));
}
// 部门及以下数据权限SQL生成逻辑
else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope)) {
    sqlString.append(StringUtils.format(
        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
        deptAlias, user.getDeptId(), user.getDeptId()
    ));
}

使用示例:用户列表查询权限控制

在用户管理Service方法上添加@DataScope注解即可启用权限控制:

@Service
public class SysUserServiceImpl implements ISysUserService {
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<SysUser> selectUserList(SysUser user) {
        return userMapper.selectUserList(user);
    }
}

对应的MyBatis映射文件中引用权限参数:

<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
    select u.*, d.dept_name from sys_user u
    left join sys_dept d on u.dept_id = d.dept_id
    where u.del_flag = '0'
    <if test="dataScope != null and dataScope != ''">
        and ${dataScope}
    </if>
</select>

列级权限设计方案

列级权限控制用户可查看的字段范围,RuoYi-Vue-fast通过两种方式实现:

1. 数据脱敏实现

系统提供DesensitizedUtil工具类,支持对手机号、身份证号等敏感字段进行脱敏处理:

// 手机号脱敏示例:138****5678
String mobile = DesensitizedUtil.mobilePhone("13812345678");
// 身份证号脱敏示例:110********1234
String idCard = DesensitizedUtil.idCardNum("110123199001011234", 6, 4);

2. 动态字段过滤

通过自定义Jackson序列化器,根据用户权限动态控制JSON响应字段:

public class SensitiveJsonSerializer extends StdScalarSerializer<String> {
    private DesensitizedType type;
    
    @Override
    public void serialize(String value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        if (SecurityUtils.hasPermi("system:user:sensitive")) {
            gen.writeString(value); // 有权限用户查看原始数据
        } else {
            gen.writeString(DesensitizedUtil.desensitize(value, type)); // 无权限用户查看脱敏数据
        }
    }
}

权限配置与管理

角色数据权限配置

在角色管理界面可配置数据权限范围,对应表结构为:

  • sys_role:存储角色基本信息及数据权限类型
  • sys_role_dept:存储自定义数据权限的部门关联关系

权限控制示例代码

部门数据权限控制的核心SQL实现:

-- 部门及以下数据权限查询逻辑
SELECT dept_id FROM sys_dept 
WHERE dept_id = #{deptId} 
OR find_in_set(#{deptId}, ancestors)

对应Java实现见DataScopeAspect.java#L138

sqlString.append(StringUtils.format(
    " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
    deptAlias, user.getDeptId(), user.getDeptId()
));

最佳实践与扩展建议

性能优化策略

  1. 权限缓存:将用户权限计算结果缓存至Redis,减少重复计算

    // 缓存权限计算结果示例
    String cacheKey = "data_scope:" + user.getUserId() + ":" + permission;
    String dataScopeSql = redisCache.getCacheObject(cacheKey);
    if (StringUtils.isEmpty(dataScopeSql)) {
        dataScopeSql = calculateDataScope(user, permission);
        redisCache.setCacheObject(cacheKey, dataScopeSql, 30, TimeUnit.MINUTES);
    }
    
  2. 索引优化:为dept_iduser_id等权限过滤字段建立索引

  3. 查询优化:复杂权限场景考虑使用视图或物化视图预计算权限范围

扩展方向

  1. 数据权限审计:通过LogAspect记录权限变更日志
  2. 动态权限调整:实现权限的实时更新,无需重启应用
  3. 多维度权限:结合数据所有者、创建时间等维度实现更精细的权限控制

总结

RuoYi-Vue-fast通过AOP切面+注解驱动+动态SQL的方式,实现了灵活高效的数据权限控制。核心优势在于:

  1. 低侵入性:通过注解方式实现权限控制,不侵入业务逻辑
  2. 可扩展性:支持自定义权限策略扩展
  3. 性能优异:权限计算逻辑简洁高效,支持缓存优化

开发人员可通过调整DataScopeAspectSysRole实现更复杂的权限需求,系统也提供了完整的权限管理界面和SQL脚本(ry_20250522.sql)供参考。

掌握这套权限体系,能够帮助企业构建更安全、更灵活的应用系统,满足不同层级用户的数据访问需求。建议结合官方文档若依环境使用手册.docx深入学习配置细节。

【免费下载链接】RuoYi-Vue-fast :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 【免费下载链接】RuoYi-Vue-fast 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-fast

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值