Spring Security自定义JWT过滤器未生效 无令牌请求可正常访问问题求助
问题排查与解决方案
1. 确认包扫描配置有效性
你的SecurityConfig上标注了@ComponentScan("my.pac"),需同时满足以下条件:
SecurityConfig本身必须在Spring Boot启动类的扫描包路径下,否则整个安全配置不会被容器加载,所有规则都不生效JwtFilter、JwtProvider、CustomUserDetailsService三个类必须全部位于my.pac包或其子包内,否则JwtFilter无法被正常实例化注入到安全配置中,自然不会被加入过滤链执行。
2. 排查WebSecurity全局忽略规则
如果你重写了configure(WebSecurity web)方法,并且配置了web.ignoring()规则覆盖了所有接口路径,那么所有请求会直接跳过整个Spring Security过滤链,你的自定义过滤器也不会触发。如果存在该类配置,仅保留静态资源、公共接口等不需要鉴权的路径即可。
3. 调整过滤器基类
建议将JwtFilter的父类从GenericFilterBean替换为OncePerRequestFilter,避免Servlet容器中同请求多次触发过滤器的问题,原有逻辑无需修改:
@Component public class JwtFilter extends OncePerRequestFilter { // 保留原有所有业务逻辑即可 }
4. 验证过滤器实例化状态
在JwtFilter的构造方法或者@PostConstruct注解的初始化方法中添加日志输出,如果启动后无对应日志,说明过滤器未被Spring容器加载,优先回查包扫描配置。
补充说明:你现有JwtFilter的逻辑仅负责填充认证上下文,本身不会拦截无有效token的请求。在你配置
anyRequest().authenticated()后,无有效token的请求正常会被Spring Security原生拦截返回401,如果此时无token请求仍能正常访问,可确定是你的安全配置整体未生效,优先排查第一条的包扫描问题。
内容的提问来源于stack exchange,提问作者Ilya Y
相关产品推荐
相关产品推荐

