Spring 引导管理员:自定义标头身份验证



我的应用具有基于自定义 HTTP 标头的自定义身份验证机制。AFAIK,Spring Boot Admin 仅支持 Basic auth 和 OAuth。但是,也许有一种方法可以让客户端提供一些自定义标头以及他们的请求?

您可以通过注入 Bean 将自定义标头添加到现有标头中,如下所示。

@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return instance -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-CUSTOM", "My Custom Value");
return httpHeaders;
};
}

好的,所以如果SBA服务器和SBA客户端都与受监视的应用程序本身一起启动,并且它具有自定义标头的安全性,我们需要注意3件事:

  1. 正如 Nitin 所提到的,需要注册HttpHeadersProvider豆:
@Bean
public HttpHeadersProvider customHttpHeadersProvider() {
return instance -> {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("X-CUSTOM", "My Custom Value");
return httpHeaders;
};
}
  1. 注意,这些标头不适用于对执行器端点的OPTIONS请求,因此需要自定义ProbeEndpointsStrategy,或者禁用 Spring 安全性以OPTIONS调用管理 URL。另外,出于某种原因,我不得不禁用/actuator/health/**的安全性,尽管它应该可以通过提供的自定义标头进行访问:
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers(HttpMethod.OPTIONS, "/actuator/**").antMatchers(HttpMethod.GET, "/actuator/health/**");
}
  1. 最后,需要使用预填充自定义标头的自定义RestTemplate实例化ApplicationRegistrator
@Bean
public ApplicationRegistrator registrator(ClientProperties client, ApplicationFactory applicationFactory) {
RestTemplateBuilder builder = new RestTemplateBuilder()
.setConnectTimeout(client.getConnectTimeout())
.setReadTimeout(client.getReadTimeout())
.additionalInterceptors((request, body, execution) -> {
request.getHeaders().set("X-CUSTOM", "My Custom Value");
return execution.execute(request, body);
});
if (client.getUsername() != null) {
builder = builder.basicAuthentication(client.getUsername(), client.getPassword());
}
return new ApplicationRegistrator(builder.build(), client, applicationFactory);
}

最新更新