UserContextInterceptor.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.zswl.dataservice.auth;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.zswl.dataservice.model.user.LoginUser;
  5. import com.zswl.dataservice.service.base.RedisService;
  6. import com.zswl.dataservice.utils.exception.UnauthorizedException;
  7. import jakarta.servlet.http.HttpServletRequest;
  8. import jakarta.servlet.http.HttpServletResponse;
  9. import org.apache.commons.codec.binary.Base64;
  10. import org.apache.commons.codec.binary.StringUtils;
  11. import org.springframework.http.HttpStatus;
  12. import org.springframework.web.servlet.HandlerInterceptor;
  13. import org.springframework.web.servlet.ModelAndView;
  14. //@Slf4j
  15. public class UserContextInterceptor implements HandlerInterceptor {
  16. private JWTManager jwtManager;
  17. private AuthSettings authSettings;
  18. private RedisService redisService;
  19. public UserContextInterceptor(AuthSettings authSettings, JWTManager jwtManager, RedisService redisService) {
  20. this.authSettings = authSettings;
  21. this.jwtManager = jwtManager;
  22. this.redisService = redisService;
  23. }
  24. @Override
  25. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception {
  26. String method = request.getMethod();
  27. if (method != null && "OPTIONS".equals(method)) {
  28. return true;
  29. }
  30. String token = request.getHeader(authSettings.getTokenHeaderName());
  31. if (token != null && token.length() > 0) {
  32. try {
  33. LoginUser user = verifyUser(token);
  34. UserContext.set(user);
  35. return true;
  36. } catch (UnauthorizedException ue) {
  37. if (UserAuthUtil.isFree(authSettings, request)) {
  38. return true;
  39. }
  40. response.setCharacterEncoding("UTF-8");
  41. response.setHeader("Content-Type", "application/json");
  42. response.setStatus(HttpStatus.UNAUTHORIZED.value());
  43. JSONObject data = new JSONObject();
  44. data.put("message", ue.getMessage());
  45. response.getWriter().write(data.toString());
  46. response.getWriter().flush();
  47. response.getWriter().close();
  48. return false;
  49. }
  50. } else if (UserAuthUtil.isCodeValidate(authSettings, request)) {
  51. String code = request.getParameter("_validate_code");
  52. if (code != null && code.length() > 0 && redisService.verifyExpireCode(code)) {
  53. String payloadJson = StringUtils.newStringUtf8(Base64.decodeBase64(code));
  54. JSONObject jo = JSON.parseObject(payloadJson);
  55. if (jo != null) {
  56. LoginUser user = new LoginUser();
  57. user.setLoginName(jo.getString("loginName"));
  58. user.setId(jo.getString("userId"));
  59. UserContext.set(user);
  60. }
  61. return true;
  62. } else {
  63. response.setCharacterEncoding("UTF-8");
  64. response.setHeader("Content-Type", "application/json");
  65. response.setStatus(HttpStatus.UNAUTHORIZED.value());
  66. JSONObject data = new JSONObject();
  67. data.put("message", "您访问资源(图片,文件,音频等)时,提供的验证code无效");
  68. response.getWriter().write(data.toJSONString());
  69. response.getWriter().flush();
  70. response.getWriter().close();
  71. return false;
  72. }
  73. } else {
  74. if (UserAuthUtil.isFree(authSettings, request)) {
  75. return true;
  76. } else {
  77. // throw new UnauthorizedUserException("用户没有登录,请登录");
  78. response.setCharacterEncoding("UTF-8");
  79. response.setHeader("Content-Type", "application/json");
  80. response.setStatus(HttpStatus.UNAUTHORIZED.value());
  81. JSONObject data = new JSONObject();
  82. data.put("message", "用户没有登录,请登录");
  83. JSONObject exception = new JSONObject();
  84. exception.put("type", "AuthenticationCredentialsNotFoundException");
  85. data.put("state", "Fail");
  86. data.put("exception", exception);
  87. response.getWriter().write(data.toJSONString());
  88. response.getWriter().flush();
  89. response.getWriter().close();
  90. return false;
  91. }
  92. }
  93. }
  94. @Override
  95. public void postHandle(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  96. }
  97. @Override
  98. public void afterCompletion(jakarta.servlet.http.HttpServletRequest request, jakarta.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
  99. UserContext.shutdown();
  100. }
  101. private LoginUser verifyUser(String token) throws UnauthorizedException {
  102. return jwtManager.verifyToken(token);
  103. }
  104. }