LoginController.java 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package com.simuwang.manage.api;
  2. import cn.hutool.core.map.MapUtil;
  3. import com.simuwang.base.common.util.ServletUtils;
  4. import com.simuwang.base.pojo.dto.sys.UserUpdatePwdCmd;
  5. import com.simuwang.logging.SystemLog;
  6. import com.simuwang.manage.dto.LoginUser;
  7. import com.simuwang.manage.dto.UserInfoVO;
  8. import com.simuwang.manage.service.LoginService;
  9. import com.simuwang.shiro.core.ShiroToken;
  10. import com.simuwang.shiro.core.ShiroUser;
  11. import com.simuwang.shiro.core.jwt.JwtContext;
  12. import com.simuwang.shiro.utils.UserUtils;
  13. import com.smppw.common.pojo.ResultVo;
  14. import com.smppw.common.pojo.enums.status.ResultCode;
  15. import jakarta.validation.Valid;
  16. import org.apache.shiro.subject.Subject;
  17. import org.springframework.web.bind.annotation.*;
  18. import java.util.Map;
  19. /**
  20. * 登录相关接口
  21. */
  22. @SystemLog(value = "登录")
  23. @RestController
  24. @RequestMapping("/v1")
  25. public class LoginController {
  26. private final JwtContext jwtContext;
  27. private final LoginService loginService;
  28. public LoginController(JwtContext jwtContext, LoginService loginService) {
  29. this.jwtContext = jwtContext;
  30. this.loginService = loginService;
  31. }
  32. /**
  33. * 获取rsk公钥
  34. *
  35. * @return /
  36. */
  37. // @SystemLog(value = "获取公钥", type = SystemLog.Type.QUERY)
  38. @GetMapping("rsa-key")
  39. public Map<String, Object> getRsaKey() {
  40. return MapUtil.<String, Object>builder("rsaKey", this.loginService.getRsaPublicKey()).build();
  41. }
  42. /**
  43. * 用户登录
  44. *
  45. * @param loginUser 登录用户账号和密码
  46. * // * @param response 响应体对象
  47. * @return /
  48. */
  49. @SystemLog(value = "登录", type = SystemLog.Type.LOGIN)
  50. @PostMapping("login")
  51. public ResultVo<String> login(@RequestBody LoginUser loginUser) {
  52. ShiroToken shiroToken = new ShiroToken(loginUser.getUsername(), loginUser.getPassword());
  53. Subject subject = UserUtils.getSubject();
  54. subject.login(shiroToken);
  55. String requestIp = ServletUtils.getIpAddr();
  56. String token = this.jwtContext.generateToken(loginUser.getUsername(), requestIp);
  57. // 加这response会导致响应头和shiro的默认字符集存在冲突,导致接口500
  58. // response.setHeader(JwtContext.HEADER, token);
  59. // response.setHeader("Access-control-Expost-Headers", JwtContext.HEADER);
  60. return ResultVo.ok(ResultCode.SUCCESS.getCode(), "登录成功", token);
  61. }
  62. /**
  63. * 退出登录接口,登录用户才能访问
  64. */
  65. @SystemLog(value = "登出", type = SystemLog.Type.LOGOUT)
  66. @PostMapping("/logout")
  67. public ResultVo<Boolean> logout() {
  68. Subject subject = UserUtils.getSubject();
  69. ShiroUser shiroUser = UserUtils.getLoginUser(subject);
  70. String requestIp = ServletUtils.getIpAddr();
  71. this.jwtContext.cleanUserCache(shiroUser.getUsername(), requestIp);
  72. subject.logout();
  73. return ResultVo.ok(ResultCode.SUCCESS.getCode(), "退出成功", true);
  74. }
  75. /**
  76. * 获取当前用户的角色权限信息(只在登录时获取一次)
  77. *
  78. * @return 当前登录用户的角色权限信息
  79. */
  80. @GetMapping("/user-info")
  81. public UserInfoVO getUserInfo() {
  82. return this.loginService.getUserInfo();
  83. }
  84. /**
  85. * 修改密码
  86. *
  87. * @param command 修改密码对象
  88. */
  89. @SystemLog(value = "修改密码", type = SystemLog.Type.UPDATE)
  90. @PostMapping("update-pwd")
  91. public boolean updatePwd(@Valid @RequestBody UserUpdatePwdCmd command) {
  92. this.loginService.updatePwd(command);
  93. return true;
  94. }
  95. }