内容提要
本文讨论了在Spring Security中使用JWT时,JwtFilter的注册问题。由于使用@Component注解,JwtFilter被错误地添加到过滤器链,导致拦截不该拦截的请求。解决方案是直接实例化JwtFilter并在SecurityFilter链中配置,以避免此问题。
关键要点
-
在Spring Security+JWT登录中,用户登录成功后返回JWT字符串,后续请求携带该字符串进行校验。
-
JwtFilter用于从请求中提取JWT字符串进行校验,但由于使用@Component注解,导致其被错误地添加到过滤器链中。
-
使用WebSecurityCustomizer放行的请求不应被JwtFilter拦截,但由于JwtFilter被添加到原生过滤器链中,导致拦截了这些请求。
-
Spring Boot在启动时会自动查找Filter类型的Bean并添加到过滤器链中,导致JwtFilter默认拦截所有请求。
-
解决方案是不要将JwtFilter注册为Spring容器中的Bean,而是直接实例化并在SecurityFilter链中配置,以避免拦截不该拦截的请求。
延伸问答
在Spring Security中,JwtFilter的作用是什么?
JwtFilter用于从请求中提取JWT字符串并进行校验,以确保用户的身份验证。
为什么JwtFilter会错误地拦截不该拦截的请求?
因为JwtFilter被错误地注册为Spring容器中的Bean,导致它被添加到原生过滤器链中,拦截了所有请求。
如何解决JwtFilter错误拦截请求的问题?
解决方案是不要将JwtFilter注册为Spring容器中的Bean,而是直接实例化并在SecurityFilter链中配置。
Spring Boot如何处理Filter类型的Bean?
Spring Boot在启动时会自动查找Filter类型的Bean并将其添加到过滤器链中,默认拦截所有请求。
使用WebSecurityCustomizer时,JwtFilter会有什么影响?
使用WebSecurityCustomizer放行的请求不应被JwtFilter拦截,但由于JwtFilter被错误添加到过滤器链中,导致拦截了这些请求。
在Spring Security中,如何正确配置JwtFilter?
应直接实例化JwtFilter并在配置过滤器链时使用http.addFilterAfter方法,而不是使用@Component注解。