Spring 升级到 Boot 1.2 后无法访问引导执行器健康端点

Spring Boot actuator health endpoint not accessible after upgrading to Boot 1.2

我在升级 Spring 从 1.1.12 启动到 1.2.5 时遇到问题,但在 1.2.x 的所有版本中都存在同样的问题。 Actuator 提供的 /health 端点现在 returning 401 Unauthorized to an integration test that used to work。升级依赖项时没有更改代码。

这是测试用例:

@Test
public void testNoUserForStatusEndpoint() throws Exception {
    HttpEntity<String> entity = new HttpEntity<>(null, headers);
    ResponseEntity<String> response = template
            .exchange(base + "/health", HttpMethod.GET, entity, String.class);
    assertEquals(HttpStatus.OK, response.getStatusCode());
    assertEquals("{\"status\":\"UP\"}", response.getBody());
}

我希望看到基本的 "UP" 状态,但没有进一步的详细信息,因为用户是匿名的且未经过身份验证。

在 application.properties 中设置 management.security.enabled=false 会导致端点 return 完整的健康信息。这是不可取的。

设置endpoints.health.sensitive=false什么都不做。

安全配置没有改变。它基于 Apache 终止和证书白名单,也没有改变。

@Override
public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
    http.addFilterBefore(new CustomAuthenticationFilter(authenticationManager(), Environment.getUserWhitelist()), BasicAuthenticationFilter.class);
}

如何才能通过测试?

更新:

最初在 application.properties 中定义的唯一相关设置是 endpoints.health.enabled=true

management.health.status.order=UP,DOWN,OUT_OF_SERVICE,UNKNOWN 添加到 application.properties 没有区别。

使用所有三个属性会导致 401(不起作用):

endpoints.health.enabled=true
endpoints.health.sensitive=false
management.health.status.order=UP,DOWN,OUT_OF_SERVICE,UNKNOWN

主要 class 只是一个精简的 Spring 引导应用程序启动器:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

我试过在上面详述的安全配置方法的第一行添加http.authorizeRequests().antMatchers("/health**").permitAll();。没什么区别。

根据Spring Boot issue 2120,使用自定义安全时忽略endpoints.health.sensitive 属性。我在文档中没有提到这一点。

请在 application.properties 或 application.yml 上试试这个:-

management.health.status.order=UP,DOWN,OUT_OF_SERVICE,UNKNOWN

我找到了解决办法。

@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 添加到我的自定义身份验证过滤器(在问题中称为 CustomAuthenticationFilter)更改了定义安全过滤器 bean 的语义。

没有注释,Spring Boot 假定我想覆盖所有过滤器并单独使用我的自定义过滤器。

通过注释,Spring Boot 将我的过滤器添加到预定义过滤器列表中。这允许 /health 端点再次工作。

有关详细信息,请参阅 GitHub 上的 Spring Boot issue 2120

或添加management.security.enabled=false 到 application.properties

我在使用 /health url 时遇到 404 错误。但是它与 /actuator/health url 而不是 /health.

一起工作