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

时间:2019-02-15 20:23:48

标签: spring-boot spring-security spring-boot-actuator

我正在尝试构建弹簧启动应用程序,并希望利用Actuator功能,但是我想确保Actuator / health,/ shutdown等端点的安全。我有以下配置似乎无法正常工作。即,应用程序从不提示输入凭据,或者当邮递员点击时未给出403。我尝试了多种方法,甚至是spring文档中的方法。有人可以帮忙吗?再次是Spring Boot2.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 个答案:

答案 0 :(得分: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();

}

}