LoginController.java 4.2 KB

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