LoginController.java 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.usky.controller.login;
  2. import com.usky.constant.Constant;
  3. import com.usky.entity.sys.vo.SysUserVO;
  4. import com.usky.exception.CustomUnauthorizedException;
  5. import com.usky.service.sys.user.LoginService;
  6. import com.usky.service.sys.user.UserService;
  7. import com.usky.utils.AuthorizationUtils;
  8. import com.usky.utils.RedisUtil;
  9. import com.usky.utils.Result;
  10. import com.usky.utils.jwt.AesCipherUtil;
  11. import com.usky.utils.jwt.JwtUtil;
  12. import io.swagger.annotations.Api;
  13. import io.swagger.annotations.ApiImplicitParam;
  14. import io.swagger.annotations.ApiImplicitParams;
  15. import io.swagger.annotations.ApiOperation;
  16. import org.apache.commons.lang3.StringUtils;
  17. import org.apache.shiro.SecurityUtils;
  18. import org.apache.shiro.authc.AuthenticationException;
  19. import org.apache.shiro.authc.AuthenticationToken;
  20. import org.apache.shiro.authc.UsernamePasswordToken;
  21. import org.apache.shiro.subject.Subject;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.beans.factory.annotation.Value;
  24. import org.springframework.context.annotation.PropertySource;
  25. import org.springframework.http.HttpStatus;
  26. import org.springframework.validation.annotation.Validated;
  27. import org.springframework.web.bind.annotation.*;
  28. import javax.servlet.http.HttpServletResponse;
  29. /**
  30. * @author laowo
  31. * @version v1.0
  32. * @date 2021/8/19 17:09
  33. * @description TODO
  34. **/
  35. @RestController
  36. @RequestMapping("sys")
  37. @Api(tags = "登录")
  38. @PropertySource("classpath:config.properties")
  39. public class LoginController {
  40. @Autowired
  41. private LoginService loginService;
  42. @Autowired
  43. private RedisUtil redisUtil;
  44. /**
  45. * RefreshToken过期时间
  46. */
  47. @Value("${refreshTokenExpireTime}")
  48. private String refreshTokenExpireTime;
  49. @PostMapping("login")
  50. @ApiImplicitParams({
  51. @ApiImplicitParam(name = "loginName", value = "登录名", required = true, paramType = "query"),
  52. @ApiImplicitParam(name = "passWord", value = "密码", required = true, paramType = "query")
  53. })
  54. public Result<?> login(@RequestParam("loginName") String loginName,
  55. @RequestParam("passWord") String passWord, HttpServletResponse httpServletResponse) {
  56. SysUserVO user = loginService.findUserByUsername(loginName);
  57. if (user.getStatus().equals("1")) {
  58. return Result.error("账户已停用,请联系管理员!");
  59. }
  60. String key = AesCipherUtil.deCrypto(user.getPassword());
  61. if (key.equals(loginName + passWord)) {
  62. // 清除可能存在的Shiro权限信息缓存
  63. if (redisUtil.hasKey(Constant.PREFIX_SHIRO_CACHE + loginName)) {
  64. redisUtil.hasKey(Constant.PREFIX_SHIRO_CACHE + loginName);
  65. }
  66. // 设置RefreshToken,时间戳为当前时间戳,直接设置即可(不用先删后设,会覆盖已有的RefreshToken)
  67. String currentTimeMillis = String.valueOf(System.currentTimeMillis());
  68. redisUtil.set(Constant.PREFIX_SHIRO_REFRESH_TOKEN + loginName, currentTimeMillis, Integer.parseInt(refreshTokenExpireTime));
  69. // 从Header中Authorization返回AccessToken,时间戳为当前时间戳
  70. String token = JwtUtil.sign(loginName, currentTimeMillis);
  71. httpServletResponse.setHeader("Authorization", token);
  72. httpServletResponse.setHeader("Access-Control-Expose-Headers", "Authorization");
  73. return Result.OK("登录成功");
  74. } else {
  75. throw new CustomUnauthorizedException("帐号或密码错误(Account or Password Error.)");
  76. }
  77. }
  78. @PostMapping("loginOut")
  79. @ApiOperation(value = "用户退出")
  80. public Result<?> loginOut() {
  81. AuthorizationUtils.clearAllCachedAuthorizationInfo();
  82. return Result.error("操作成功");
  83. }
  84. }