feat(user): 增加用户角色管理功能
- 在 User 实体中添加 roles 字段,用于存储用户拥有的所有角色 - 在 UserCreateDto 中添加 roleIds 字段,用于创建用户时指定多个角色 - 修改 UserDetailsImpl以支持多个角色 - 新增 UserRolesRepository 接口,用于管理用户角色关联 - 更新 UserServiceImpl 中的 create 方法,支持创建用户时分配多个角色
This commit is contained in:
parent
7624d94145
commit
e4bf57f3ec
@ -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<Long> roleIds = userRolesRepository.selectByUserId(user.getId());
|
||||
List<Role> roles = roleRepository.selectByIds(roleIds);
|
||||
user.setRoles(roles);
|
||||
List<Dept> depts = deptService.listTree(user.deptId);
|
||||
List<Dept> flat = TreeUtil.flat(depts, Dept::getChildren, d -> d.setChildren(null));
|
||||
Set<Long> dataScopeDeptIds = flat.stream().map(Dept::getId).collect(Collectors.toSet());
|
||||
|
@ -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<Role> roles;
|
||||
public Set<Authority> authorities;
|
||||
public Set<String> permissions;
|
||||
public Set<Long> dataScopeDeptIds;
|
||||
|
||||
public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Set<Long> dataScopeDeptIds, Role role, Set<Authority> authorities, Set<String> permissions) {
|
||||
public UserDetailsImpl(Long id, String username, String password, String name, Boolean enableState, Dept dept, Set<Long> dataScopeDeptIds, Role role, Set<Authority> authorities, Set<String> permissions, List<Role> 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<String> permissions) {
|
||||
@ -60,7 +63,8 @@ public class UserDetailsImpl implements UserDetails {
|
||||
user.dataScopeDeptIds,
|
||||
user.role,
|
||||
user.role.authorities,
|
||||
permissions
|
||||
permissions,
|
||||
user.roles
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -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<Long> roleIds;
|
||||
}
|
||||
|
@ -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<Role> roles;
|
||||
/**
|
||||
* 头像
|
||||
*/
|
||||
|
@ -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<UserRole> {
|
||||
@Select("select role_id from sys_users_roles where user_id = #{userId}")
|
||||
List<Long> selectByUserId(@Param("userId") Long userId);
|
||||
}
|
@ -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<UserRepository, User> 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<UserRole> 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
|
||||
|
Loading…
Reference in New Issue
Block a user