[重大更新] 数据权限增加角色与菜单关联 实现 角色->菜单->数据权限 控制数据权限功能(实验性功能不稳定)

This commit is contained in:
疯狂的狮子Li
2026-03-12 14:19:54 +08:00
parent 0a42df2ab2
commit 4c5f52d47e
12 changed files with 214 additions and 42 deletions

View File

@@ -124,7 +124,11 @@ public class SysRoleController extends BaseController {
public R<Void> dataScope(@RequestBody SysRoleBo role) {
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
return toAjax(roleService.authDataScope(role));
if (roleService.authDataScope(role) > 0) {
roleService.cleanOnlineUserByRole(role.getRoleId());
return R.ok();
}
return R.fail("修改角色'" + role.getRoleName() + "'数据权限失败,请联系管理员");
}
/**
@@ -137,7 +141,11 @@ public class SysRoleController extends BaseController {
public R<Void> changeStatus(@RequestBody SysRoleBo role) {
roleService.checkRoleAllowed(role);
roleService.checkRoleDataScope(role.getRoleId());
return toAjax(roleService.updateRoleStatus(role.getRoleId(), role.getStatus()));
if (roleService.updateRoleStatus(role.getRoleId(), role.getStatus()) > 0) {
roleService.cleanOnlineUserByRole(role.getRoleId());
return R.ok();
}
return R.fail("修改角色'" + role.getRoleName() + "'状态失败,请联系管理员");
}
/**

View File

@@ -1,5 +1,6 @@
package org.dromara.system.mapper;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.utils.StreamUtils;
@@ -8,9 +9,7 @@ import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
import org.dromara.system.domain.SysMenu;
import org.dromara.system.domain.vo.SysMenuVo;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.*;
/**
* 菜单表 数据层
@@ -111,6 +110,21 @@ public interface SysMenuMapper extends BaseMapperPlus<SysMenu, SysMenuVo> {
return new HashSet<>(StreamUtils.filter(list, StringUtils::isNotBlank));
}
/**
* 根据角色ID列表批量查询权限
*
* @param roleIds 角色ID列表
* @return 角色权限映射
*/
default Map<Long, Set<String>> selectMenuPermsByRoleIds(List<Long> roleIds) {
if (CollUtil.isEmpty(roleIds)) {
return Map.of();
}
Map<Long, Set<String>> result = new LinkedHashMap<>();
roleIds.forEach(roleId -> result.put(roleId, this.selectMenuPermsByRoleId(roleId)));
return result;
}
/**
* 根据用户ID查询菜单
*

View File

@@ -6,6 +6,7 @@ import org.dromara.system.domain.bo.SysMenuBo;
import org.dromara.system.domain.vo.RouterVo;
import org.dromara.system.domain.vo.SysMenuVo;
import java.util.Map;
import java.util.List;
import java.util.Set;
@@ -49,6 +50,14 @@ public interface ISysMenuService {
*/
Set<String> selectMenuPermsByRoleId(Long roleId);
/**
* 根据角色ID列表批量查询权限
*
* @param roleIds 角色ID列表
* @return 角色权限映射
*/
Map<Long, Set<String>> selectMenuPermsByRoleIds(List<Long> roleIds);
/**
* 根据用户ID查询菜单树信息
*

View File

@@ -1,5 +1,9 @@
package org.dromara.system.service;
import org.dromara.common.core.domain.dto.RoleDTO;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@@ -25,4 +29,12 @@ public interface ISysPermissionService {
*/
Set<String> getMenuPermission(Long userId);
/**
* 根据角色列表构建数据权限角色映射
*
* @param roles 角色列表
* @return key 为权限码 value 为命中的角色列表
*/
Map<String, List<RoleDTO>> getDataScopeRoleMap(List<RoleDTO> roles);
}

View File

@@ -30,6 +30,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
@@ -105,6 +106,17 @@ public class SysMenuServiceImpl implements ISysMenuService {
return baseMapper.selectMenuPermsByRoleId(roleId);
}
/**
* 根据角色ID列表批量查询权限
*
* @param roleIds 角色ID列表
* @return 角色权限映射
*/
@Override
public Map<Long, Set<String>> selectMenuPermsByRoleIds(List<Long> roleIds) {
return baseMapper.selectMenuPermsByRoleIds(roleIds);
}
/**
* 根据用户ID查询菜单
*

View File

@@ -1,16 +1,18 @@
package org.dromara.system.service.impl;
import cn.hutool.core.collection.CollUtil;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.SystemConstants;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.service.PermissionService;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.service.ISysMenuService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysRoleService;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.Set;
import java.util.*;
/**
* 用户权限处理
@@ -59,4 +61,21 @@ public class SysPermissionServiceImpl implements ISysPermissionService, Permissi
}
return perms;
}
@Override
public Map<String, List<RoleDTO>> getDataScopeRoleMap(List<RoleDTO> roles) {
if (CollUtil.isEmpty(roles)) {
return Map.of();
}
Map<Long, RoleDTO> roleMap = StreamUtils.toIdentityMap(roles, RoleDTO::getRoleId);
List<Long> roleIds = StreamUtils.toList(roles, RoleDTO::getRoleId);
Map<Long, Set<String>> permsRoleIds = menuService.selectMenuPermsByRoleIds(roleIds);
Map<String, List<RoleDTO>> rolePermsMap = new LinkedHashMap<>();
permsRoleIds.forEach((roleId, perms) -> {
perms.forEach(perm -> {
rolePermsMap.computeIfAbsent(perm, k -> new ArrayList<>()).add(roleMap.get(roleId));
});
});
return rolePermsMap;
}
}