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

Spring Security 6:不同路由两种认证机制配置冲突问题解决

如何在Spring Security 6中为不同路由配置两种认证机制

你的问题核心在于两个SecurityFilterChain没有明确限定各自的处理范围,导致优先级高的FilterChain会匹配所有请求,完全覆盖另一个的作用。以下是修复方案:

问题根源

原配置中第一个securityFilterChain使用了requestMatchers("**"),这会匹配所有HTTP请求。当它的@Order(1)时,所有请求(包括/actuator/**)都会走这个FilterChain,第二个actuatorSecurityFilterChain根本不会被触发;如果调换Order顺序,/actuator/**会被第二个FilterChain处理,但第一个FilterChain的"**"依然会匹配剩下的所有请求,逻辑上虽然能区分,但配置写法不规范,容易引发冲突。

修正后的配置

1. 主路由(非/actuator/**)的SecurityFilterChain

@Bean
@Order(1)
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        // 明确限定当前FilterChain只处理非/actuator/**的请求
        .securityMatcher(PathRequest.toAnyRequest().excluding("/actuator/**"))
        .csrf(AbstractHttpConfigurer::disable)
        .cors(cors -> {})
        .authorizeHttpRequests(auth ->
            // 根据实际需求调整:比如放行公开路径,其余需要认证
            auth.requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
        )
        .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        // 直接设置当前FilterChain的认证入口点(已限定路径范围)
        .exceptionHandling(handler -> handler.authenticationEntryPoint(jwtAuthenticationEntryPoint))
        .addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
        .headers(headers -> headers.cacheControl(cacheControl -> {}));

    return http.build();
}

2. Actuator路由的SecurityFilterChain

@Bean
@Order(2)
public SecurityFilterChain actuatorSecurityFilterChain(HttpSecurity http) throws Exception {
    http
        // 明确限定当前FilterChain只处理/actuator/**的请求
        .securityMatcher("/actuator/**")
        .csrf(AbstractHttpConfigurer::disable)
        .cors(cors -> {})
        .authorizeHttpRequests(auth ->
            // 根据实际需求调整:比如actuator健康端点公开,其余需管理员权限
            auth.requestMatchers("/actuator/health").permitAll()
                .anyRequest().hasRole("ADMIN")
        )
        .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
        // 设置Actuator专属的认证入口点
        .exceptionHandling(handler -> handler.authenticationEntryPoint(actuatorAuthenticationEntryPoint))
        .anonymous(AbstractHttpConfigurer::disable);

    return http.build();
}

关键要点

  • 用securityMatcher限定FilterChain范围:Spring Security 6推荐通过securityMatcher明确每个FilterChain负责的路径,框架会按@Order顺序匹配请求,匹配到对应范围的FilterChain就会用其配置处理,不会互相覆盖。
  • 避免全局匹配"**":不要在requestMatchers中使用"**"作为第一个匹配规则,这会抢占所有请求的处理权。
  • 独立配置认证入口点:每个FilterChain直接使用authenticationEntryPoint设置专属入口点即可,无需使用defaultAuthenticationEntryPointFor(该方法适合单FilterChain场景下给特定路径覆盖全局入口点)。

内容的提问来源于stack exchange,提问作者Ali Azlan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:10:34