From 50493c504ebd05928db4f3a598442e81404ed48d Mon Sep 17 00:00:00 2001 From: fitz2019 <1481035758@qq.com> Date: Sat, 19 Oct 2024 00:17:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E8=A7=92=E8=89=B2=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?,=E5=B9=B6=E8=BF=87=E6=BB=A4=E5=B1=95=E7=A4=BA[=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/permission/RoleServiceImpl.java | 54 +++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) 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 6203cd7d34..88d3073fe0 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 @@ -9,6 +9,7 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; @@ -24,12 +25,15 @@ import com.mzt.logapi.starter.annotation.LogRecord; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; 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; @@ -124,13 +128,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 +217,55 @@ public class RoleServiceImpl implements RoleService { return CollectionUtils.convertList(ids, self::getRoleFromCache); } + + private Integer getCurrentUserRoleType() { + /* + 从 SecurityContext 中获取当前用户的角色信息 + 目的: + 当角色类型为 SYSTEM 时,返回所有角色(包括 SYSTEM 和 CUSTOM)。 + 当角色类型为 CUSTOM 时,仅返回 CUSTOM 角色。 + */ + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null) { + if (((LoginUser) (authentication.getPrincipal())).getId() == 1) { + return RoleTypeEnum.SYSTEM.getType(); + } else { + return RoleTypeEnum.CUSTOM.getType(); + } + } + // 如果没有找到角色,返回默认值 : 自定义角色 + return RoleTypeEnum.CUSTOM.getType(); + } + @Override public PageResult getRolePage(RolePageReqVO reqVO) { - return roleMapper.selectPage(reqVO); + /* + * 获取当前用户的角色类型,并过滤展示[用户管理] + */ + //TODO: Frank + Integer currentUserRoleType = 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)) { -- Gitee From e17aa2bf8f839d09b9ad9bb1298f0c672f359b74 Mon Sep 17 00:00:00 2001 From: fitz2019 <1481035758@qq.com> Date: Sat, 19 Oct 2024 10:30:09 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E8=A7=92=E8=89=B2=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?,=E5=B9=B6=E8=BF=87=E6=BB=A4=E5=B1=95=E7=A4=BA[=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=AE=A1=E7=90=86].=20=E8=A7=92=E8=89=B2=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E8=BF=87=E6=BB=A4=E6=8E=89=20ID=20=E4=B8=BA=201=20?= =?UTF-8?q?=E7=9A=84=E7=94=A8=E6=88=B7=EF=BC=88=E5=86=85=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=91=98=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/admin/user/UserController.java | 24 ++++++++++ .../service/permission/RoleServiceImpl.java | 30 ++---------- .../util/securityutils/SecurityUtils.java | 48 +++++++++++++++++++ 3 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/securityutils/SecurityUtils.java 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 253857b91c..e04b524193 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 88d3073fe0..54c895edde 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 @@ -9,7 +9,6 @@ import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RolePageReqVO; import cn.iocoder.yudao.module.system.controller.admin.permission.vo.role.RoleSaveReqVO; import cn.iocoder.yudao.module.system.dal.dataobject.permission.RoleDO; @@ -18,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; @@ -25,8 +25,6 @@ import com.mzt.logapi.starter.annotation.LogRecord; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; @@ -42,8 +40,6 @@ import static cn.iocoder.yudao.module.system.enums.LogRecordConstants.*; /** * 角色 Service 实现类 - * - * @author 芋道源码 */ @Service @Slf4j @@ -218,32 +214,12 @@ public class RoleServiceImpl implements RoleService { } - private Integer getCurrentUserRoleType() { - /* - 从 SecurityContext 中获取当前用户的角色信息 - 目的: - 当角色类型为 SYSTEM 时,返回所有角色(包括 SYSTEM 和 CUSTOM)。 - 当角色类型为 CUSTOM 时,仅返回 CUSTOM 角色。 - */ - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null) { - if (((LoginUser) (authentication.getPrincipal())).getId() == 1) { - return RoleTypeEnum.SYSTEM.getType(); - } else { - return RoleTypeEnum.CUSTOM.getType(); - } - } - // 如果没有找到角色,返回默认值 : 自定义角色 - return RoleTypeEnum.CUSTOM.getType(); - } - @Override public PageResult getRolePage(RolePageReqVO reqVO) { /* - * 获取当前用户的角色类型,并过滤展示[用户管理] + * 获取当前用户的角色类型,并过滤展示 */ - //TODO: Frank - Integer currentUserRoleType = getCurrentUserRoleType(); + Integer currentUserRoleType = SecurityUtils.getCurrentUserRoleType(); // 获取角色列表 PageResult rolePageResult = roleMapper.selectPage(reqVO); 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 0000000000..80b2ec21cc --- /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(); + } +} -- Gitee