Spring Boot中忽略特定路由JWT校验的实现方案合理性及业界常用实践咨询
你好呀!作为经常和Spring Boot安全模块打交道的开发者,我来聊聊你的实现方案和业界常用的做法~
你的现有方案分析
你现在同时用了两种方式来跳过JWT校验:一是在SecurityFilterChain里给/auth/**和/welcome设置permitAll,二是在JwtAuthenticationFilter里重写shouldNotFilter方法跳过这些路径。这个方案是可以正常工作的,但存在一点冗余——这两种操作本质上都是在做“跳过JWT校验”的事情,属于重复配置。
业界常用的实践方案
1. 仅通过SecurityFilterChain配置(推荐)
这是Spring Security最标准的做法:直接在安全配置类里通过permitAll()开放不需要认证的路径,剩下的路径统一要求认证。这样做的好处是:
- 安全规则集中管理,逻辑更清晰,后续维护权限时不用同时修改配置和过滤器代码
- Spring Security的过滤器链会自动跳过这些开放路径的认证流程,你的JWT过滤器根本不会被触发到这些请求,不需要额外在过滤器里处理跳过逻辑
你可以把代码简化成这样:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { return http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests( authorizeHttp -> { authorizeHttp.requestMatchers("/auth/**", "/welcome").permitAll(); authorizeHttp.anyRequest().authenticated(); } ) .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) .build(); } }
同时去掉过滤器里重写的shouldNotFilter方法即可。
2. 通过过滤器的shouldNotFilter控制(适合特殊场景)
如果你的业务场景需要:某些路径虽然不需要JWT校验,但要走这个过滤器里的其他逻辑(比如日志记录、公共参数校验),那重写shouldNotFilter是合理的。但这种场景比较少见,大部分开放路径(比如登录、注册、公开欢迎页)根本不需要经过JWT过滤器,所以没必要用这种方式。
3. 过滤器URL模式匹配(较少用)
你也可以通过@WebFilter注解指定过滤器的匹配路径,比如只让JWT过滤器匹配/**排除/auth/**和/welcome,但这种方式不如Security配置灵活——Spring Security的配置可以整合角色权限、CSRF控制等更多安全规则,更适合统一管理。
总结
你的现有方案能正常工作,但存在冗余问题。业界最常用的是仅通过SecurityFilterChain的permitAll配置来开放不需要JWT校验的路径,这样代码更简洁,也符合Spring Security的设计思路。
备注:内容来源于stack exchange,提问作者Thanh Dương Phan

