Spring Web Security配置错误:Actuator与API端点鉴权规则失效
问题根源
你的配置确实存在匹配逻辑和顺序错误,两个异常现象的原因非常明确:
- 配置里的
.antMatcher("/service/actuator/**")是当前整个安全过滤链的根路径匹配规则,意味着这条过滤链只会处理匹配/service/actuator/**的请求,/service/api/**路径的请求根本不会进入这条链的鉴权流程,自然会出现无需认证就能访问的情况。 - 你将JWT过滤器直接注册在了这条仅匹配actuator路径的过滤链上,所有走到actuator的请求都会先经过JWT过滤器校验,因此才会出现actuator端点同时认可JWT和HTTP Basic两种凭证的问题。
单条HttpSecurity配置不适合处理多套完全独立的鉴权规则,强行在一条链里写分支匹配很容易出现规则互相覆盖、过滤器全局生效的问题。
最优实现方案
Spring Security 对多端点差异化鉴权的标准实现是配置多条优先级不同的独立安全过滤链,每条链只负责处理对应路径的鉴权逻辑,过滤器、认证方式完全隔离,不会互相干扰。
代码示例(Spring Security 5.7+ 推荐写法,无WebSecurityConfigurerAdapter)
首先配置优先级最高的actuator专属过滤链,仅启用HTTP Basic认证,不加载JWT过滤器:
@Bean @Order(1) // 数值越小优先级越高,优先匹配特殊路径 public SecurityFilterChain actuatorSecurityFilterChain(HttpSecurity http) throws Exception { http .csrf().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() // 明确指定当前链只处理actuator路径 .requestMatchers().antMatchers("/service/actuator/**") .and() .authorizeRequests().anyRequest().authenticated() .and() // 仅启用HTTP Basic .httpBasic() .and() .exceptionHandling().authenticationEntryPoint(restAuthenticationEntryPoint); return http.build(); }
再配置次优先级的API专属过滤链,仅启用JWT认证,不开启HTTP Basic:
@Bean @Order(2) public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http, JwtTokenFilter jwtTokenFilter) throws Exception { http .csrf().disable() .anonymous().disable() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() // 明确指定当前链只处理API路径 .requestMatchers().antMatchers("/service/api/**") .and() .authorizeRequests().anyRequest().authenticated() .and() // 仅在API链注册JWT过滤器 .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class) .and() .exceptionHandling().authenticationEntryPoint(restAuthenticationEntryPoint); return http.build(); }
如果需要对其余未匹配的路径做兜底鉴权,可以再加一条@Order(Ordered.LOWEST_PRECEDENCE)的过滤链,匹配/**配置默认规则即可。
配置注意事项
- 路径匹配范围越窄、鉴权规则越特殊的过滤链,
@Order的数值要越小,保证优先被匹配 - 不要把特定场景的过滤器(比如JWT过滤器)全局注册到Spring容器上下文,否则会被自动加到所有过滤链上,一定要手动注册到对应专属过滤链中
- 如果是使用5.7以下版本的Spring Security,可以通过写多个带
@Order注解的WebSecurityConfigurerAdapter实现相同逻辑,核心思路还是多链隔离
内容的提问来源于stack exchange,提问作者Siddhartha
相关产品推荐
相关产品推荐

