| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- package com.happy.interceptor;
- import com.alibaba.fastjson.JSONObject;
- import com.happy.Model.Login;
- import com.happy.Until.ResultUtil;
- import com.happy.Until.TokenUtil;
- import com.happy.annotation.PassToken;
- import com.happy.annotation.UserLoginToken;
- import com.happy.constant.ResultStatusCode;
- import com.happy.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.method.HandlerMethod;
- import org.springframework.web.servlet.HandlerInterceptor;
- import org.springframework.web.servlet.ModelAndView;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.lang.reflect.Method;
- import java.time.LocalDateTime;
- import java.util.List;
- public class AuthenticationInterceptor implements HandlerInterceptor {
- @Autowired
- UserService userService;
- @Override
- public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception {
- String access_token = TokenUtil.getRequestToken(httpServletRequest);
- // 如果不是映射到方法直接通过
- if(!(object instanceof HandlerMethod)){
- return true;
- }
- HandlerMethod handlerMethod=(HandlerMethod)object;
- Method method=handlerMethod.getMethod();
- //检查是否有passtoken注释,有则跳过认证
- if (method.isAnnotationPresent(PassToken.class)) {
- PassToken passToken = method.getAnnotation(PassToken.class);
- if (passToken.required()) {
- return true;
- }
- }
- //检查有没有需要用户权限的注解
- if (method.isAnnotationPresent(UserLoginToken.class)) {
- UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class);
- if (userLoginToken.required()) {
- // 执行认证
- if (access_token == null) {
- throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.SHIRO_ERROR)));
- }
- //1. 根据token,查询用户信息
- List<Login> logins = userService.findByToken(access_token);
- //2. 若用户不存在,
- if (logins.isEmpty()) {
- throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.LOGINED_IN2)));
- }
- //3. token失效
- LocalDateTime tie = LocalDateTime.parse(logins.get(0).getAccess_token());
- if (tie.isBefore(LocalDateTime.now())) {
- throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.LOGINED_IN3)));
- }
- return true;
- }
- }
- return true;
- }
- @Override
- public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
- }
- @Override
- public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
- }
- }
|