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