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

Spring Security仅校验/actuator端点认证,忽略其他端点Auth头

问题:Spring Security仅对/actuator端点启用Basic认证,忽略其他端点的Auth头

我需要配置Spring Security,仅对/actuator/**端点执行Basic认证校验,其余应用端点允许公开访问。但现有配置下,非actuator端点携带任意Basic Auth请求头时,会触发认证校验并返回401错误。由于业务场景需要持续携带Basic Auth头,希望非actuator端点直接忽略该请求头并放行。

尝试过的无效配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
        .antMatchers("/actuator/**").hasRole("ACTUATOR")
        .antMatchers("/**").permitAll()
        .and().httpBasic();
}

技术栈

  • Java 17
  • Spring Boot 2.7.12

已实现的可行方案(寻求更优雅实现)

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity web) {
        web.ignoring()
           .regexMatchers("^(?!/actuator).*$");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/actuator/**")
            .hasRole("ACTUATOR")
            .and()
            .httpBasic();
    }
}

更优雅的实现方案

原配置无效的核心原因:httpBasic()会对所有请求启用Basic Auth过滤器,即使路径被permitAll()放行,当请求携带无效Auth头时,仍会触发认证失败返回401。

推荐通过限制Basic Auth过滤器的生效路径解决,无需完全绕过Spring Security过滤器链,更贴合框架设计:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 定义仅匹配actuator路径的请求匹配器
        RequestMatcher actuatorRequestMatcher = new AntPathRequestMatcher("/actuator/**");

        http
            // 所有请求默认允许访问
            .authorizeRequests(auth -> auth
                .anyRequest().permitAll()
            )
            // 仅对actuator路径启用Basic认证
            .httpBasic(basic -> basic
                .requestMatcher(actuatorRequestMatcher)
            )
            // 对actuator路径单独配置角色权限校验
            .authorizeRequests(auth -> auth
                .antMatchers("/actuator/**").hasRole("ACTUATOR")
            );
    }
}

如果倾向于使用Spring Security 5.4+推荐的SecurityFilterChain风格(更适配后续版本API),可参考:

@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        RequestMatcher actuatorRequestMatcher = new AntPathRequestMatcher("/actuator/**");

        http
            .authorizeHttpRequests(auth -> auth
                .anyRequest().permitAll()
            )
            .httpBasic(basic -> basic
                .requestMatcher(actuatorRequestMatcher)
            )
            .authorizeHttpRequests(auth -> auth
                .antMatchers("/actuator/**").hasRole("ACTUATOR")
            );

        return http.build();
    }

    // 示例用户配置(生产环境需替换为加密密码+持久化存储)
    @Bean
    public InMemoryUserDetailsManager userDetailsManager() {
        UserDetails actuatorUser = User.withUsername("actuator")
            .password("{noop}actuator123")
            .roles("ACTUATOR")
            .build();
        return new InMemoryUserDetailsManager(actuatorUser);
    }
}

这种方式精准控制了Basic Auth的生效范围,非actuator路径即使携带Auth头也不会触发认证校验,同时保留了Spring Security过滤器链的其他能力(如CSRF防护、异常处理等),比web.ignoring()的实现更安全、更符合框架设计逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:57:34