SpringBoot配置permitAll放行路径仍执行自定义Filter问题
核心原因
antMatchers().permitAll() 配置不会阻止自定义过滤器执行,这是Spring Security初学者的高频认知误区:
- Spring Security的请求处理逻辑是按固定顺序执行的完整过滤器链,你通过
addFilter()手动注册的AuthorizationFilter是全局挂载到过滤链上的组件,只要请求进入Spring Security过滤链,该过滤器就会按顺序触发,和你配置的路径访问规则没有关联。 permitAll()只是内置拦截器FilterSecurityInterceptor的访问规则,作用仅为「允许匹配路径的请求跳过权限校验直接访问目标接口」,不会跳过链上其他自定义过滤器、内置过滤器的执行逻辑。你观察到注册接口能正常访问、用户数据能正常保存,只是因为permitAll()给这些路径放了访问权限,不代表自定义过滤器不会运行。
解决方案
你可以根据业务场景选以下两种实现方式:
- 方案1:自定义过滤器内部增加白名单判断
在AuthorizationFilter的过滤逻辑最开头增加路径匹配,命中白名单的请求直接跳过校验逻辑,传递给下一个过滤器即可,示例代码:
@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String requestUri = request.getRequestURI(); // 命中白名单直接放行,不执行授权校验逻辑 if (requestUri.contains("/login") || requestUri.contains("/signup") || requestUri.startsWith("/home/")) { filterChain.doFilter(request, response); return; } // 以下是你原有的授权校验逻辑 // ... }
- 方案2:配置全局路径忽略,让白名单路径完全绕过Spring Security过滤链
注册WebSecurityCustomizerBean配置忽略路径,匹配的请求不会进入任何Spring Security过滤器,自然也不会触发你自定义的AuthorizationFilter,示例代码:
@Bean public WebSecurityCustomizer webSecurityCustomizer() { return web -> web.ignoring() .antMatchers("/**/signup", "/home/**"); }
注意:如果你的登录接口需要走Spring Security内置的认证逻辑(比如用户名密码校验、成功/失败回调),不要把
/**/login配置到全局忽略列表里,否则登录接口的认证逻辑也会被跳过,这类路径用方案1在自定义过滤器里手动跳过即可。
补充认知纠正:Spring Security中所有路径匹配规则只对当前规则所属的过滤器生效,不会修改整条过滤链的执行流程,不要把permitAll()等同于「跳过所有安全过滤器」的标记。
内容的提问来源于stack exchange,提问作者Danish Javed
相关产品推荐
相关产品推荐

