AuthenticationInterceptor.java 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package com.happy.interceptor;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.happy.Model.Login;
  4. import com.happy.Until.ResultUtil;
  5. import com.happy.Until.TokenUtil;
  6. import com.happy.annotation.PassToken;
  7. import com.happy.annotation.UserLoginToken;
  8. import com.happy.constant.ResultStatusCode;
  9. import com.happy.service.UserService;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.web.method.HandlerMethod;
  12. import org.springframework.web.servlet.HandlerInterceptor;
  13. import org.springframework.web.servlet.ModelAndView;
  14. import javax.servlet.http.HttpServletRequest;
  15. import javax.servlet.http.HttpServletResponse;
  16. import java.lang.reflect.Method;
  17. import java.time.LocalDateTime;
  18. import java.util.List;
  19. public class AuthenticationInterceptor implements HandlerInterceptor {
  20. @Autowired
  21. UserService userService;
  22. @Override
  23. public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
  24. String access_token = TokenUtil.getRequestToken(httpServletRequest);
  25. // 如果不是映射到方法直接通过
  26. if(!(object instanceof HandlerMethod)){
  27. return true;
  28. }
  29. HandlerMethod handlerMethod=(HandlerMethod)object;
  30. Method method=handlerMethod.getMethod();
  31. //检查是否有passtoken注释,有则跳过认证
  32. if (method.isAnnotationPresent(PassToken.class)) {
  33. PassToken passToken = method.getAnnotation(PassToken.class);
  34. if (passToken.required()) {
  35. return true;
  36. }
  37. }
  38. //检查有没有需要用户权限的注解
  39. if (method.isAnnotationPresent(UserLoginToken.class)) {
  40. UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
  41. if (userLoginToken.required()) {
  42. // 执行认证
  43. if (access_token == null) {
  44. throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.SHIRO_ERROR)));
  45. }
  46. //1. 根据token,查询用户信息
  47. List<Login> logins = userService.findByToken(access_token);
  48. //2. 若用户不存在,
  49. if (logins.isEmpty()) {
  50. throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.LOGINED_IN2)));
  51. }
  52. //3. token失效
  53. LocalDateTime tie = LocalDateTime.parse(logins.get(0).getAccess_token());
  54. if (tie.isBefore(LocalDateTime.now())) {
  55. throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.LOGINED_IN3)));
  56. }
  57. return true;
  58. }
  59. }
  60. return true;
  61. }
  62. @Override
  63. public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
  64. }
  65. @Override
  66. public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
  67. }
  68. }