diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java index 253857b91ceb86aef80775bd0d4440ca244b59dd..e04b524193f46f13bcda6e7286bdd874f7b63c66 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/UserController.java @@ -12,8 +12,10 @@ import cn.iocoder.yudao.module.system.convert.user.UserConvert; import cn.iocoder.yudao.module.system.dal.dataobject.dept.DeptDO; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.enums.common.SexEnum; +import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; import cn.iocoder.yudao.module.system.service.dept.DeptService; import cn.iocoder.yudao.module.system.service.user.AdminUserService; +import cn.iocoder.yudao.module.system.util.securityutils.SecurityUtils; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; @@ -30,6 +32,7 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -91,11 +94,32 @@ public class UserController { @Operation(summary = "获得用户分页列表") @PreAuthorize("@ss.hasPermission('system:user:list')") public CommonResult> getUserPage(@Valid UserPageReqVO pageReqVO) { + // 获取当前用户的角色类型 + Integer currentUserRoleType = SecurityUtils.getCurrentUserRoleType(); + // 获得用户分页列表 PageResult pageResult = userService.getUserPage(pageReqVO); + if (CollUtil.isEmpty(pageResult.getList())) { return success(new PageResult<>(pageResult.getTotal())); } + + // TODO Frank 如果当前用户是自定义角色,过滤掉 ID 为 1 的用户(内置管理员) + if (RoleTypeEnum.CUSTOM.getType().equals(currentUserRoleType)) { + List filteredList = pageResult.getList().stream() + // 过滤掉用户ID为1的记录 + .filter(user -> !user.getId().equals(1L)) + .collect(Collectors.toList()); + + // 更新过滤后的列表 + pageResult.setList(filteredList); + + // 更新总数,如果原始列表中包含ID为1的用户,则减1 + if (pageResult.getList().size() < pageResult.getTotal()) { + pageResult.setTotal(pageResult.getTotal() - 1); + } + } + // 拼接数据 Map deptMap = deptService.getDeptMap( convertList(pageResult.getList(), AdminUserDO::getDeptId)); diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java index 6203cd7d34e623421de603e8004d8fd7aef19fc4..54c895edde6bd79f5a3ea662c76176869735dbbf 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/permission/RoleServiceImpl.java @@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.system.dal.redis.RedisKeyConstants; import cn.iocoder.yudao.module.system.enums.permission.DataScopeEnum; import cn.iocoder.yudao.module.system.enums.permission.RoleCodeEnum; import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; +import cn.iocoder.yudao.module.system.util.securityutils.SecurityUtils; import com.google.common.annotations.VisibleForTesting; import com.mzt.logapi.context.LogRecordContext; import com.mzt.logapi.service.impl.DiffParseFunction; @@ -30,6 +31,7 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; @@ -38,8 +40,6 @@ import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; /** * 角色 Service 实现类 - * - * @author 芋道源码 */ @Service @Slf4j @@ -124,13 +124,13 @@ public class RoleServiceImpl implements RoleService { /** * 校验角色的唯一字段是否重复 - * + *

* 1. 是否存在相同名字的角色 * 2. 是否存在相同编码的角色 * * @param name 角色名字 * @param code 角色额编码 - * @param id 角色编号 + * @param id 角色编号 */ @VisibleForTesting void validateRoleDuplicate(String name, String code, Long id) { @@ -213,11 +213,35 @@ public class RoleServiceImpl implements RoleService { return CollectionUtils.convertList(ids, self::getRoleFromCache); } + @Override public PageResult getRolePage(RolePageReqVO reqVO) { - return roleMapper.selectPage(reqVO); + /* + * 获取当前用户的角色类型,并过滤展示 + */ + Integer currentUserRoleType = SecurityUtils.getCurrentUserRoleType(); + + // 获取角色列表 + PageResult rolePageResult = roleMapper.selectPage(reqVO); + + // 过滤角色列表 + List filteredRoles = rolePageResult.getList().stream() + .filter(role -> { + // 如果当前用户是内置角色,可以查看所有角色 + if (RoleTypeEnum.SYSTEM.getType().equals(currentUserRoleType)) { + return true; // 查看所有角色 + } else { + // 如果当前用户是自定义角色,只能查看自定义角色 + return RoleTypeEnum.CUSTOM.getType().equals(role.getType()); + } + }) + .collect(Collectors.toList()); + + // 返回过滤后的结果,保持总量为原始总量 + return new PageResult<>(filteredRoles, rolePageResult.getTotal()); } + @Override public boolean hasAnySuperAdmin(Collection ids) { if (CollectionUtil.isEmpty(ids)) { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/securityutils/SecurityUtils.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/securityutils/SecurityUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..80b2ec21cc4f6268922f3fa59dd49e5b719ab5e4 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/securityutils/SecurityUtils.java @@ -0,0 +1,48 @@ +package cn.iocoder.yudao.module.system.util.securityutils; + +import cn.iocoder.yudao.framework.security.core.LoginUser; +import cn.iocoder.yudao.module.system.enums.permission.RoleTypeEnum; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * @author: Leo + * @date: 2024/10/19 00199:26 + * @description: + * @version: 1.0 + */ +@SuppressWarnings({"all"}) + +/** + * Security 工具类 + * 用于从 Spring Security 中获取当前用户信息 + */ +public class SecurityUtils { + + // 系统超级管理员用户的ID常量 [system_role 表超级管理员 的ID] + private static final Long SYSTEM_ADMIN_ID = 1L; + + /** + * 获取当前登录用户的角色类型 + * + * 如果当前用户的角色类型为 SYSTEM,则返回 SYSTEM 类型(可以查看所有角色)。 + * 如果当前用户的角色类型为 CUSTOM,则返回 CUSTOM 类型(只能查看自定义角色)。 + * 如果无法找到当前用户,则默认返回 CUSTOM 类型。 + * + * @return 当前用户的角色类型 + */ + public static Integer getCurrentUserRoleType() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getPrincipal() instanceof LoginUser) { + LoginUser loginUser = (LoginUser) authentication.getPrincipal(); + // 判断是否为系统管理员角色,通过常量 SYSTEM_ADMIN_ID + if (SYSTEM_ADMIN_ID.equals(loginUser.getId())) { + return RoleTypeEnum.SYSTEM.getType(); + } else { + return RoleTypeEnum.CUSTOM.getType(); + } + } + // 如果无法获取当前用户信息,返回自定义角色类型,保持最低权限 + return RoleTypeEnum.CUSTOM.getType(); + } +}