yudaocode/ruoyi-vue-pro:角色权限配置指南
引言
在企业级应用开发中,权限管理是保障系统安全的核心模块。yudaocode/ruoyi-vue-pro 基于 RBAC(Role-Based Access Control,基于角色的访问控制)模型,提供了一套完整、灵活且易于扩展的权限管理系统。本文将深入解析该项目的角色权限配置机制,帮助开发者快速掌握权限配置的最佳实践。
RBAC 权限模型架构
ruoyi-vue-pro 采用标准的 RBAC 权限模型,其核心架构如下:
核心数据模型
系统权限管理的核心数据对象包括:
数据对象 | 表名 | 描述 |
---|---|---|
RoleDO | system_role | 角色实体,存储角色基本信息 |
MenuDO | system_menu | 菜单实体,包含权限标识 |
RoleMenuDO | system_role_menu | 角色-菜单关联表 |
UserRoleDO | system_user_role | 用户-角色关联表 |
角色管理核心功能
1. 角色基础属性配置
每个角色包含以下关键属性:
public class RoleDO extends TenantBaseDO {
private Long id; // 角色ID
private String name; // 角色名称
private String code; // 角色标识(枚举值)
private Integer sort; // 角色排序
private Integer status; // 角色状态(0-禁用,1-启用)
private Integer type; // 角色类型(1-系统角色,2-自定义角色)
private String remark; // 备注
private Integer dataScope; // 数据范围权限
private Set<Long> dataScopeDeptIds; // 数据权限部门ID集合
}
2. 数据权限范围配置
系统支持多种数据权限范围,通过 dataScope
字段控制:
数据范围 | 值 | 描述 |
---|---|---|
ALL | 1 | 查看所有数据 |
DEPT_CUSTOM | 2 | 自定义数据权限 |
DEPT_ONLY | 3 | 仅查看本部门数据 |
DEPT_AND_CHILD | 4 | 查看本部门及子部门数据 |
SELF | 5 | 仅查看本人数据 |
权限分配实战指南
1. 角色菜单权限分配
通过 PermissionController.assignRoleMenu()
方法实现角色菜单权限的分配:
@PostMapping("/assign-role-menu")
@Operation(summary = "赋予角色菜单")
@PreAuthorize("@ss.hasPermission('system:permission:assign-role-menu')")
public CommonResult<Boolean> assignRoleMenu(@Validated @RequestBody PermissionAssignRoleMenuReqVO reqVO) {
permissionService.assignRoleMenu(reqVO.getRoleId(), reqVO.getMenuIds());
return success(true);
}
请求参数示例:
{
"roleId": 1,
"menuIds": [100, 101, 102, 103]
}
2. 用户角色分配
通过 PermissionController.assignUserRole()
方法实现用户角色分配:
@PostMapping("/assign-user-role")
@Operation(summary = "赋予用户角色")
@PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')")
public CommonResult<Boolean> assignUserRole(@Validated @RequestBody PermissionAssignUserRoleReqVO reqVO) {
permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds());
return success(true);
}
请求参数示例:
{
"userId": 1001,
"roleIds": [1, 2]
}
3. 数据权限配置
通过 PermissionController.assignRoleDataScope()
方法配置角色的数据权限:
@PostMapping("/assign-role-data-scope")
@Operation(summary = "赋予角色数据权限")
@PreAuthorize("@ss.hasPermission('system:permission:assign-role-data-scope')")
public CommonResult<Boolean> assignRoleDataScope(@Valid @RequestBody PermissionAssignRoleDataScopeReqVO reqVO) {
permissionService.assignRoleDataScope(reqVO.getRoleId(), reqVO.getDataScope(), reqVO.getDataScopeDeptIds());
return success(true);
}
请求参数示例:
{
"roleId": 1,
"dataScope": 2,
"dataScopeDeptIds": [100, 101, 102]
}
权限验证机制
1. 权限检查接口
系统提供 PermissionService.hasAnyPermissions()
方法进行权限验证:
@Override
public boolean hasAnyPermissions(Long userId, String... permissions) {
// 获得当前登录的角色
List<RoleDO> roles = getEnableUserRoleListByUserIdFromCache(userId);
if (CollUtil.isEmpty(roles)) {
return false;
}
// 遍历判断每个权限
for (String permission : permissions) {
if (hasAnyPermission(roles, permission)) {
return true;
}
}
return roleService.hasAnySuperAdmin(convertSet(roles, RoleDO::getId));
}
2. 角色检查接口
通过 PermissionService.hasAnyRoles()
方法进行角色验证:
@Override
public boolean hasAnyRoles(Long userId, String... roles) {
List<RoleDO> roleList = getEnableUserRoleListByUserIdFromCache(userId);
if (CollUtil.isEmpty(roleList)) {
return false;
}
Set<String> userRoles = convertSet(roleList, RoleDO::getCode);
return CollUtil.containsAny(userRoles, Sets.newHashSet(roles));
}
多租户权限处理
ruoyi-vue-pro 支持 SaaS 多租户模式,权限配置时会自动进行租户过滤:
// 开启多租户的情况下,需要过滤掉未开通的菜单
tenantService.handleTenantMenu(menuIds ->
reqVO.getMenuIds().removeIf(menuId -> !CollUtil.contains(menuIds, menuId))
);
最佳实践建议
1. 角色规划策略
角色类型 | 建议配置 | 适用场景 |
---|---|---|
超级管理员 | 所有权限 + 所有数据权限 | 系统管理 |
部门管理员 | 部门管理权限 + 本部门数据权限 | 部门管理 |
普通用户 | 业务操作权限 + 个人数据权限 | 日常操作 |
2. 权限分配流程
3. 缓存优化策略
系统使用 Redis 缓存权限数据,提升权限验证性能:
@Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId")
public Set<Long> getUserRoleIdListByUserIdFromCache(Long userId) {
return getUserRoleIdListByUserId(userId);
}
@Cacheable(value = RedisKeyConstants.MENU_ROLE_ID_LIST, key = "#menuId")
public Set<Long> getMenuRoleIdListByMenuIdFromCache(Long menuId) {
return convertSet(roleMenuMapper.selectListByMenuId(menuId), RoleMenuDO::getRoleId);
}
常见问题排查
1. 权限不生效排查步骤
- 检查角色状态:确认角色处于启用状态
- 验证菜单权限:确认菜单已正确分配给角色
- 检查用户角色:确认用户已分配相应角色
- 查看数据权限:确认数据权限范围设置正确
2. 缓存问题处理
如果权限配置后未立即生效,可清理相关缓存:
# 清理用户角色缓存
redis-cli keys '*user_role*' | xargs redis-cli del
# 清理菜单角色缓存
redis-cli keys '*menu_role*' | xargs redis-cli del
总结
ruoyi-vue-pro 的角色权限系统提供了完整、灵活的 RBAC 实现,支持菜单权限、数据权限和多租户场景。通过本文的详细指南,开发者可以:
- 深入理解权限模型架构
- 掌握各种权限配置方法
- 遵循最佳实践进行权限规划
- 快速排查权限相关问题
该权限系统已在众多企业级项目中得到验证,能够满足复杂的权限管理需求,为系统安全提供坚实保障。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考