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.
一起工作
我在升级 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.
一起工作