Spring Boot 3.0.6中permitAll()配置后Security Filter Chain仍生效问题
Spring Boot 3.0.6中JWT过滤器拦截permitAll路径的问题原因
核心原因分析
- 过滤器执行顺序错误:你自定义的
JwtAuthenticationFilter如果是通过addFilterBefore/addFilterAfter直接加入Spring Security过滤器链,且没限定拦截路径,就会在Security的认证逻辑(包括permitAll()判断)之前执行。这时候还没走到路径放行的判断,过滤器就先校验JWT,自然抛出"Your request doesn't have jwt"异常。 - 路径匹配规则不兼容:Spring Boot 3.x默认使用
PathPatternParser(对应配置时的pathPatterns()方法),如果你还在使用旧的antMatchers()配置permitAll(),可能出现路径匹配失效的情况。比如/api/v1/auth/*用Ant匹配仅覆盖单层级子路径,若接口路径匹配逻辑不符合预期,就会导致放行规则不生效。 - 自定义过滤器未做路径白名单判断:你的
JwtAuthenticationFilter代码里可能没有先校验当前请求路径是否属于放行范围,不管请求路径是什么,直接执行JWT校验逻辑,完全绕过了Spring Security的路径放行配置。
快速验证方向
- 检查Security配置类,确认是否给自定义过滤器指定了拦截路径,比如用
addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)时,要确保过滤器只拦截需要认证的路径(而非所有路径)。 - 把配置中的
antMatchers("/api/v1/auth/**")替换为pathPatterns("/api/v1/auth/**"),适配Spring Boot 3.x的路径匹配规则。 - 在
JwtAuthenticationFilter的doFilterInternal方法开头,先判断请求路径是否在白名单(比如/api/v1/auth/*)里,如果是则直接放行,不执行JWT校验。
内容的提问来源于stack exchange,提问作者Monach
相关产品推荐
相关产品推荐

