diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/controller/UserController.java b/src/main/java/com/zsc/edu/gateway/modules/system/controller/UserController.java index acde2a3..16c7bf2 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/controller/UserController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/controller/UserController.java @@ -59,6 +59,11 @@ public class UserController { return map; } + @PatchMapping("/switch/{roleId}") + public UserDetailsImpl switchRole(@PathVariable Long roleId) { + return service.switchRole(roleId); + } + /** * 用户获取自己的信息 * diff --git a/src/main/java/com/zsc/edu/gateway/modules/system/service/UserService.java b/src/main/java/com/zsc/edu/gateway/modules/system/service/UserService.java index 93a0eb3..6b6d61d 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/system/service/UserService.java +++ b/src/main/java/com/zsc/edu/gateway/modules/system/service/UserService.java @@ -34,4 +34,6 @@ public interface UserService extends IService<User> { Boolean toggle(Long id); String sendEmail(String email); + + UserDetailsImpl switchRole(Long roleId); } 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 61206f3..779d218 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 @@ -8,16 +8,21 @@ 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.Role; import com.zsc.edu.gateway.modules.system.entity.User; import com.zsc.edu.gateway.modules.system.mapper.UserMapper; +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.service.UserService; import com.zsc.edu.gateway.modules.system.utils.sendMail; import lombok.AllArgsConstructor; import org.springframework.beans.BeanUtils; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; +import java.util.Objects; + /** * <p> * 服务实现类 @@ -35,6 +40,7 @@ public class UserServiceImpl extends ServiceImpl<UserRepository, User> implement private final DeptServiceImpl deptService; private final sendMail send; private final UserMapper userMapper; + private final RoleRepository roleRepository; @Override public Boolean create(UserCreateDto dto) { @@ -110,4 +116,27 @@ public class UserServiceImpl extends ServiceImpl<UserRepository, User> implement return updateById(user); } + @Override + public UserDetailsImpl switchRole(Long roleId) { + Role role = roleRepository.selectById(roleId); + if (role == null) { + throw new ConstraintException("角色不存在"); + } + UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + User user = getById(userDetails.getId()); + if (Objects.equals(user.getRoleId(), roleId)) { + throw new ConstraintException("不能切换到当前角色"); + } + user.setRoleId(roleId); + boolean updated = updateById(user); + userDetails.setRole(role); + if (updated) { + SecurityContextHolder.getContext().setAuthentication( + new org.springframework.security.authentication.UsernamePasswordAuthenticationToken( + userDetails, userDetails.getPassword(), userDetails.getAuthorities() + ) + ); + } + return userDetails; + } }