LoginController.java 3.3 KB

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