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;
+    }
 }