Spring Security配置web.ignoring不生效自定义过滤器仍拦截白名单URL
问题核心原因
- 你重写了
JwtAuthenticationFilter的requiresAuthentication方法直接返回true,强制所有请求都执行认证逻辑,完全覆盖了父类的路径匹配规则,所以即便修改构造函数的路径参数也不会生效。 - 认证逻辑中如果没有携带JWT会直接抛出异常,导致所有未携带token的请求(包括你配置的忽略路径)直接被拦截。
解决方案
方案一:修改过滤器的认证触发逻辑(最可靠,推荐)
直接在requiresAuthentication方法中对忽略路径做匹配,匹配成功则跳过认证,代码修改如下:
public class JwtAuthenticationFilter extends AbstractAuthenticationProcessingFilter { // Spring路径匹配工具 private static final AntPathMatcher antPathMatcher = new AntPathMatcher(); // 配置需要忽略的路径 private static final List<String> IGNORE_PATHS = Arrays.asList( "/", "/api/login", "/api/register", "/api/contacts/**" ); public JwtAuthenticationFilter() { super("/**"); } @Override protected boolean requiresAuthentication(HttpServletRequest request, HttpServletResponse response) { String requestUri = request.getRequestURI(); // 匹配到忽略路径直接跳过认证 for (String ignorePath : IGNORE_PATHS) { if (antPathMatcher.match(ignorePath, requestUri)) { return false; } } // 其他路径执行原有认证逻辑 return super.requiresAuthentication(request, response); } // 其余原有代码保持不变 }
方案二:让web.ignoring配置生效
如果你希望忽略路径完全不经过Spring Security的过滤器链,需要做如下调整:
- 确认自定义的
JwtAuthenticationFilter没有添加@Component、@Bean等注解,避免被Spring自动注册到全局过滤器链。如果加了这类注解,就算配置了web.ignoring,请求也会被全局过滤器拦截。 - 如果你的项目配置了
server.servlet.context-path上下文路径,需要确保antMatchers匹配的是去掉上下文路径后的路径,或者调整匹配规则适配上下文路径。
额外注意
你贴出的JwtAuthenticationProvider代码中存在一行多余的语法错误代码:AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_ADMIN"));,没有赋值也没有业务逻辑,需要删除。
内容的提问来源于stack exchange,提问作者ShayShoq
相关产品推荐
相关产品推荐

