public class JwtInterceptor implements HandlerInterceptor { @Autowired private IUserService userService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String token = request.getHeader("token"); if (StrUtil.isBlank(token)) { token = request.getParameter("token"); } // 如果不是映射到方法直接通过 if(handler instanceof HandlerMethod) { AuthAccess annotation = ((HandlerMethod) handler).getMethodAnnotation(AuthAccess.class); if (annotation != null) { return true; } } // 执行认证 if (StrUtil.isBlank(token)) { throw new ServiceException(Constants.CODE_401, "无token,请重新登录"); } // 获取 token 中的 user id String userId; try { userId = JWT.decode(token).getAudience().get(0); } catch (JWTDecodeException j) { throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录"); } // 根据token中的userid查询数据库 User user = userService.getById(userId); if (user == null) { throw new ServiceException(Constants.CODE_401, "用户不存在,请重新登录"); } // 用户密码加签验证 token JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build(); try { jwtVerifier.verify(token); // 验证token } catch (JWTVerificationException e) { throw new ServiceException(Constants.CODE_401, "token验证失败,请重新登录"); } return true; } }
时间: 2023-06-25 15:02:59 浏览: 83
这是一个基于Spring框架的JWT认证拦截器,主要作用是在接口方法执行前对请求进行认证,确保请求的合法性。
具体实现过程如下:
1. 首先从请求头或请求参数中获取token。
2. 判断请求是否是映射到方法,如果不是直接通过。
3. 如果是映射到方法,判断方法上是否有注解@AuthAccess,如果有直接通过。
4. 如果没有@AuthAccess注解,则需要执行认证。
5. 如果没有token,抛出异常,提示无token,请重新登录。
6. 如果有token,从token中解析出用户ID,查询数据库获取用户信息。
7. 如果用户不存在,抛出异常,提示用户不存在,请重新登录。
8. 如果用户存在,使用用户密码对token进行加签验证,确保token的合法性。
9. 如果token验证失败,抛出异常,提示token验证失败,请重新登录。
10. 如果token验证成功,返回true表示通过认证,接口方法可以执行。
相关问题
@Slf4j @Component public class UserAuthorizationInterceptor implements HandlerInterceptor { @Autowired private RsaProperties rsaProperties; @Value("${jwt.super.token.open}") private boolean openJwt; @Autowired private RedisUtils redisUtils;
这是一个 Java 类的代码片段,使用了 Spring 框架的注解。其中,@Slf4j 注解是 Lombok 提供的注解,用于自动生成日志记录器;@Component 注解用于将这个类注册为 Spring 容器中的组件;UserAuthorizationInterceptor 类实现了 HandlerInterceptor 接口,用于拦截请求并进行用户授权验证。
代码中通过 @Autowired 注解注入了 RsaProperties 类和 RedisUtils 类的实例,@Value 注解注入了一个 boolean 类型的配置属性。其中,RsaProperties 类和 RedisUtils 类可能是自定义的类,用于进行加密和缓存操作。
根据代码片段的内容,可以猜测这个类的作用是拦截请求并验证用户的身份,可能会使用 JWT(JSON Web Token)进行身份认证。在拦截器中,可能会使用 RSA 加密算法对数据进行保护,并使用 Redis 进行缓存操作。
@service public class UserServicelmpl implements UserService{ @Autowired private UserRepository userRepository; @Override public User findById(Integer id){ return userRepository.fingById(id); } }
在这段代码中,您需要确保您的类上方已经正确地导入了@Service注解,以便您可以使用它。如果您的代码中已经导入了这个注解并且仍然收到“Cannot resolve symbol 'service'”错误,则可能是因为您的项目缺少相应的依赖项。请检查您的项目的依赖项,并确保您已经正确地添加了Spring框架的依赖项。如果您仍然无法解决问题,请提供更多上下文和代码示例,以便我可以更好地帮助您。