You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security配置web.ignoring不生效自定义过滤器仍拦截白名单URL

问题核心原因

  1. 你重写了JwtAuthenticationFilter的requiresAuthentication方法直接返回true,强制所有请求都执行认证逻辑,完全覆盖了父类的路径匹配规则,所以即便修改构造函数的路径参数也不会生效。
  2. 认证逻辑中如果没有携带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:12:02