在授予RestControllers的公共访问权限时,使用用户/密码保护Actuator端点

时间:2018-05-04 06:36:13

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

我将已经存在的应用程序从Spring Boot 1.3更新到2.0.1。该应用程序使用Actuator并公开REST风格的API。

在Boot 1.3中,无需身份验证即可使用API​​,并且执行器端点配置为受密码保护:

security.user.name=foo
security.user.password=bar
security-user.role=ADMIN

我更新了此内容,如configuration changelog中所述,并将条目从security.user.name重命名为spring.security.user.name等。

但是当我尝试curl我的API时,我被拒绝了,因为我没有提供凭据: CURL is denied because unauthenticated access was tried

Spring Blog中,我找到了一个可能的解决方案,如何在详细级别配置Spring Security:

http
    .authorizeRequests()
        // 1
        .requestMatchers(EndpointRequest.to("status", "info"))
            .permitAll()
        // 2
        .requestMatchers(EndpointRequest.toAnyEndpoint())
            .hasRole("ACTUATOR")
        // 3 
        .requestMatchers(StaticResourceRequest.toCommonLocations())
            .permitAll()
        // 4
        .antMatchers("/**")
            .hasRole("USER")
    .and()
  ...

但这比我需要的更精细,我正在寻找基于application.properties的解决方案。

有没有办法在没有额外代码的情况下解决这个问题?

2 个答案:

答案 0 :(得分:5)

当您设置spring.security.user.namespring.security.user.password时,您将通过spring-security为整个应用程序配置表单登录,包括Actuator端点。

不幸的是,在Spring Boot 2.0中,您无法使用属性设置不同的用户名/密码或禁用Actuator端点的身份验证。这意味着您必须通过安全配置明确允许执行器端点。

通过spring-security,您还可以允许公共访问您的终端,并且非常容易要求执行器端点的凭据:

@Configuration
public class BasicSecurityConfig extends WebSecurityConfigurerAdapter {

    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/actuator/**").hasRole("ACTUATOR")
                .anyRequest().permitAll();
    }
}

(我假设您使用的是WebMvc,而不是WebFlux,这有点不同)

确认application.properties中有以下内容:

spring.security.user.name=user
spring.security.user.password=pass
spring.security.user.roles=ACTUATOR,USER   # and others, if you like

management.endpoint.health.roles=ACTUATOR

请参阅here,了解Spring 1.x与2.0中Actuator的差异之间的快速而精彩的解释。

答案 1 :(得分:2)

对于 Spring Boot 2.0,当我们覆盖 configureWebSecurityConfigurerAdapter 方法时,所有现有安全性都会退避,我们可以提供自定义安全性。在您的情况下,您只需要对执行器端点进行身份验证,可以按如下方式完成:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

}

无需更改 application.properties 文件。