mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-03-18 19:48:50 +08:00
[重大更新] 数据权限增加角色与菜单关联 实现 角色->菜单->数据权限 控制数据权限功能(实验性功能不稳定)
This commit is contained in:
@@ -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() + "'状态失败,请联系管理员");
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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查询菜单
|
||||
*
|
||||
|
||||
@@ -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查询菜单树信息
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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查询菜单
|
||||
*
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user