Spring boot 2.1.x 如何使用基本身份验证保护执行器端点

Posted

技术标签:

【中文标题】Spring boot 2.1.x 如何使用基本身份验证保护执行器端点【英文标题】:Spring boot 2.1.x how to secure Actuator end points with basic auth 【发布时间】:2019-07-10 00:32:01 【问题描述】:

我正在尝试构建一个 Spring Boot 应用程序并希望利用 Actuator 功能,但我想保护 Actuator /health、/shutdown 等的端点。我的以下配置似乎不起作用。即,应用程序从不提示输入凭据,或者当邮递员点击时不会给出 403。我尝试了各种方法,甚至是 spring 文档中的一种。任何人都可以帮助解决这个问题。这又是 Spring Boot 2.1.x。我知道在之前版本的spring的application.yml中可以进行配置

@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception 

        http.authorizeRequests()
                .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class, InfoEndpoint.class, HealthEndpoint.class,
                        MetricsEndpoint.class))
                .hasRole("ENDPOINT_ADMIN").requestMatchers(PathRequest.toStaticResources().atCommonLocations())
                .authenticated().and().httpBasic();
    

application.yml

spring:
  security:
    user:
      name: admin
      password: admin
      roles:
      - ENDPOINT_ADMIN

management:   
  endpoints:  
    web:
      exposure:
        include: "*"
  endpoint:
    shutdown:
      enabled: true
    health:
      show-details: when-authorized
      roles:
      - ENDPOINT_ADMIN
    mappings:
      enabled: true

【问题讨论】:

【参考方案1】:

这段代码可以作为参考来实现Actuator Endpoints Spring Boot 2.X的BasicAuth。这不是确切的代码。在扩展 WebSecurityConfigurerAdapter 时,您必须配置 AuthenticationManagerBuilder 为角色分配角色和密码。这里我使用的是“noop”密码编码器,您可以使用不同的密码编码器来提供更高的安全性。

protected void configure(AuthenticationManagerBuilder auth) throws Exception 
                            
                auth.inMemoryAuthentication().withUser("ROLE_USER").password("noop" + "USER_PWD").roles("USER").and()
                .withUser("ROLE_ADMIN").password("noop" + "ADMIN").roles("ADMIN", "USER");
    

配置 AuthenticationManagerBuilder 后,现在通过禁用 csrf 来配置 HttpSecurity。下面的代码需要使用任何角色单独对指标进行身份验证。您可以根据需要进行身份验证的端点进行自定义。确保您从此身份验证中排除了 Rest Controller 的基本 url。您可以在下面的配置代码中插入authorizeRequests().antMatchers("/baseurl").permitAll().and() 来实现这一点。下面是一个配置 HttpSecurity 的示例。

protected void configure(Httpsecurity http) 
    http.csrf().authorizeRequests().requestMatchers(EndpointRequest.to(MetricsEndpoint.class))
    .hasANyRole("ADMIN","USER").and().authorizeRequests().and().httpBasic();

【讨论】:

以上是关于Spring boot 2.1.x 如何使用基本身份验证保护执行器端点的主要内容,如果未能解决你的问题,请参考以下文章

使用 RESTful 登录 API 验证我的 Spring Boot 应用程序

如何使用 OAuth2 保护 2 个 Spring Boot 微服务之间的通信?

具有 OAuth 2 和 JWT 安全性的 Spring Boot 微服务

一起学习Spring boot 2.1.X | 第五篇:Mybatis Druid 数据库(注解版)

如何在 Spring Boot 测试中加载仅添加命名组件的基本 Spring Application-Context?

Spring Boot 整合 Web 开发