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

Mar*_*ged 2 spring-security spring-boot 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
Run Code Online (Sandbox Code Playgroud)

我更新了这个,如配置更改日志中记录的那样,并将条目重命名为security.user.nameto spring.security.user.name和like .

但是当我尝试使用curl我的API时,我被拒绝了,因为我没有提供凭据: CURL被拒绝,因为尝试了未经身份验证的访问

Spring博客中,我找到了一个可能的解决方案,如何在详细级别配置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()
  ...
Run Code Online (Sandbox Code Playgroud)

但这比我需要的更细粒度,我正在寻找一个application.properties基础的解决方案.

有没有办法解决这个没有额外的代码?

Mur*_*kan 6

设置spring.security.user.name和时spring.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

(我以为你使用的是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
Run Code Online (Sandbox Code Playgroud)

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