From e4bf57f3ec522015b2561995af87c00343e07478 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Thu, 6 Feb 2025 15:45:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(user):=20=E5=A2=9E=E5=8A=A0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E8=A7=92=E8=89=B2=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 User 实体中添加 roles 字段,用于存储用户拥有的所有角色 - 在 UserCreateDto 中添加 roleIds 字段,用于创建用户时指定多个角色 - 修改 UserDetailsImpl以支持多个角色 - 新增 UserRolesRepository 接口,用于管理用户角色关联 - 更新 UserServiceImpl 中的 create 方法,支持创建用户时分配多个角色 --- .../security/JpaUserDetailsServiceImpl.java | 18 ++++++------ .../framework/security/UserDetailsImpl.java | 8 ++++-- .../modules/system/dto/UserCreateDto.java | 8 +++++- .../gateway/modules/system/entity/User.java | 7 +++++ .../system/repo/UserRolesRepository.java | 6 ++++ .../system/service/impl/UserServiceImpl.java | 28 +++++++++++++------ 6 files changed, 55 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/zsc/edu/gateway/framework/security/JpaUserDetailsServiceImpl.java b/src/main/java/com/zsc/edu/gateway/framework/security/JpaUserDetailsServiceImpl.java index 6294330..e44e627 100644 --- a/src/main/java/com/zsc/edu/gateway/framework/security/JpaUserDetailsServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/framework/security/JpaUserDetailsServiceImpl.java @@ -2,15 +2,11 @@ package com.zsc.edu.gateway.framework.security; import com.zsc.edu.gateway.common.util.TreeUtil; import com.zsc.edu.gateway.exception.StateException; -import com.zsc.edu.gateway.modules.system.entity.Dept; -import com.zsc.edu.gateway.modules.system.entity.Menu; -import com.zsc.edu.gateway.modules.system.entity.RoleAuthority; -import com.zsc.edu.gateway.modules.system.entity.User; -import com.zsc.edu.gateway.modules.system.repo.AuthorityRepository; -import com.zsc.edu.gateway.modules.system.repo.MenuRepository; -import com.zsc.edu.gateway.modules.system.repo.RoleAuthoritiesRepository; -import com.zsc.edu.gateway.modules.system.repo.UserRepository; +import com.zsc.edu.gateway.modules.system.entity.*; +import com.zsc.edu.gateway.modules.system.repo.*; import com.zsc.edu.gateway.modules.system.service.DeptService; +import com.zsc.edu.gateway.modules.system.service.RoleService; +import com.zsc.edu.gateway.modules.system.service.impl.RoleServiceImpl; import lombok.AllArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; @@ -33,6 +29,9 @@ public class JpaUserDetailsServiceImpl implements UserDetailsService { private final AuthorityRepository authorityRepository; private final MenuRepository menuRepository; private final DeptService deptService; + private final RoleRepository roleRepository; + private final RoleService roleService; + private final UserRolesRepository userRolesRepository; @Override @Transactional(rollbackFor = Exception.class) @@ -41,6 +40,9 @@ public class JpaUserDetailsServiceImpl implements UserDetailsService { if (!user.getEnableState()) { throw new StateException("用户 '" + username + "' 已被禁用!请联系管理员"); } + List roleIds = userRolesRepository.selectByUserId(user.getId()); + List roles = roleRepository.selectByIds(roleIds); + user.setRoles(roles); List depts = deptService.listTree(user.deptId); List flat = TreeUtil.flat(depts, Dept::getChildren, d -> d.setChildren(null)); Set dataScopeDeptIds = flat.stream().map(Dept::getId).collect(Collectors.toSet()); diff --git a/src/main/java/com/zsc/edu/gateway/framework/security/UserDetailsImpl.java b/src/main/java/com/zsc/edu/gateway/framework/security/UserDetailsImpl.java index de286aa..467e338 100644 --- a/src/main/java/com/zsc/edu/gateway/framework/security/UserDetailsImpl.java +++ b/src/main/java/com/zsc/edu/gateway/framework/security/UserDetailsImpl.java @@ -11,6 +11,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -32,11 +33,12 @@ public class UserDetailsImpl implements UserDetails { public String name; public Dept dept; public Role role; + public List roles; public Set authorities; public Set permissions; public Set dataScopeDeptIds; - public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Set dataScopeDeptIds, Role role, Set authorities, Set permissions) { + public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Set dataScopeDeptIds, Role role, Set authorities, Set permissions, List roles) { this.id = id; this.username = username; this.password = password; @@ -47,6 +49,7 @@ public class UserDetailsImpl implements UserDetails { this.role = role; this.authorities = authorities; this.permissions = permissions; + this.roles = roles; } public static UserDetailsImpl from(User user, Set permissions) { @@ -60,7 +63,8 @@ public class UserDetailsImpl implements UserDetails { user.dataScopeDeptIds, user.role, user.role.authorities, - permissions + permissions, + user.roles ); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/dto/UserCreateDto.java b/src/main/java/com/zsc/edu/gateway/modules/system/dto/UserCreateDto.java index 1fbfd5a..8891692 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/dto/UserCreateDto.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/dto/UserCreateDto.java @@ -6,6 +6,8 @@ import lombok.NoArgsConstructor; import jakarta.validation.constraints.*; +import java.util.Set; + /** * 用户新建Dto * @@ -53,7 +55,7 @@ public class UserCreateDto { public Long deptId; /** - * 用户身份集合 + * 用户当前身份 */ @NotEmpty(message = "角色不能为空") public Long roleId; @@ -79,4 +81,8 @@ public class UserCreateDto { */ public Integer code; + /** + * 用户角色id集合 + */ + public Set roleIds; } diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/entity/User.java b/src/main/java/com/zsc/edu/gateway/modules/system/entity/User.java index 27f0485..3e78024 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/entity/User.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/entity/User.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import lombok.*; +import java.util.List; import java.util.Set; /** @@ -77,6 +78,12 @@ public class User extends BaseEntity { */ @TableField(exist = false) public Role role; + + /** + * 拥有的所有角色 + */ + @TableField(exist = false) + public List roles; /** * 头像 */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/repo/UserRolesRepository.java b/src/main/java/com/zsc/edu/gateway/modules/system/repo/UserRolesRepository.java index f5f5f2f..326a6ed 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/repo/UserRolesRepository.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/repo/UserRolesRepository.java @@ -2,9 +2,15 @@ package com.zsc.edu.gateway.modules.system.repo; import com.zsc.edu.gateway.modules.system.entity.UserRole; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * @author zhuang */ public interface UserRolesRepository extends BaseMapper { + @Select("select role_id from sys_users_roles where user_id = #{userId}") + List selectByUserId(@Param("userId") Long userId); } \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/UserServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/UserServiceImpl.java index edf5e50..1c7ccd6 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/UserServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/impl/UserServiceImpl.java @@ -9,15 +9,9 @@ import com.zsc.edu.gateway.modules.system.dto.UserCreateDto; import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdateDto; import com.zsc.edu.gateway.modules.system.dto.UserSelfUpdatePasswordDto; import com.zsc.edu.gateway.modules.system.dto.UserUpdateDto; -import com.zsc.edu.gateway.modules.system.entity.Menu; -import com.zsc.edu.gateway.modules.system.entity.Role; -import com.zsc.edu.gateway.modules.system.entity.RoleMenu; -import com.zsc.edu.gateway.modules.system.entity.User; +import com.zsc.edu.gateway.modules.system.entity.*; import com.zsc.edu.gateway.modules.system.mapper.UserMapper; -import com.zsc.edu.gateway.modules.system.repo.MenuRepository; -import com.zsc.edu.gateway.modules.system.repo.RoleMenuRepository; -import com.zsc.edu.gateway.modules.system.repo.RoleRepository; -import com.zsc.edu.gateway.modules.system.repo.UserRepository; +import com.zsc.edu.gateway.modules.system.repo.*; import com.zsc.edu.gateway.modules.system.service.MenuService; import com.zsc.edu.gateway.modules.system.service.UserService; import com.zsc.edu.gateway.modules.system.utils.sendMail; @@ -53,12 +47,28 @@ public class UserServiceImpl extends ServiceImpl implement private final RoleMenuRepository RoleMenuRepository; private final RoleMenuRepository roleMenuRepository; private final MenuRepository menuRepository; + private final UserRolesRepository userRolesRepository; @Override public Boolean create(UserCreateDto dto) { User user = new User(); userMapper.convert(dto, user); - return save(user); + boolean saveSuccess = save(user); + if (!saveSuccess) { + return false; + } + if (dto.getRoleIds() != null && !dto.getRoleIds().isEmpty()) { + List userRoles = dto.getRoleIds().stream() + .map(roleId -> { + UserRole userRole = new UserRole(); + userRole.setUserId(user.getId()); + userRole.setRoleId(roleId); + return userRole; + }) + .collect(Collectors.toList()); + userRolesRepository.insert(userRoles); + } + return true; } @Override