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

Spring Boot Admin: custom header authentication

我的应用程序具有基于自定义 HTTP header 的自定义身份验证机制。 AFAIK,Spring Boot Admin 仅支持基本身份验证和 OAuth。但也许有一种方法可以让客户随请求一起提供一些自定义 header?

您可以通过如下方式注入 Bean,将自定义 headers 添加到现有 headers 中。

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

好的,如果 SBA 服务器和 SBA 客户端都与受监控的应用程序本身一起启动,并且它具有 custom-headers 安全性,我们需要处理 3 件事:

  1. 正如 Nitin 提到的,需要注册 HttpHeadersProvider bean:
    @Bean
    public HttpHeadersProvider customHttpHeadersProvider() {
        return instance -> {
            HttpHeaders httpHeaders = new HttpHeaders();
            httpHeaders.add("X-CUSTOM", "My Custom Value");
            return httpHeaders;
        };
    }
  1. 请注意,这些 header 不适用于对执行器端点的 OPTIONS 请求,因此需要自定义 ProbeEndpointsStrategy 或禁用 [​​=38=] OPTIONS 调用管理 URL 的安全性。此外,出于某种原因,我不得不禁用 /actuator/health/** 的安全性,尽管它应该可以通过提供的自定义 header 访问:
    @Override
    public void configure(WebSecurity web) {
        web.ignoring().antMatchers(HttpMethod.OPTIONS, "/actuator/**").antMatchers(HttpMethod.GET, "/actuator/health/**");
    }
  1. 最后,需要用自定义 RestTemplate 实例化 ApplicationRegistrator,这将是 pre-populated 和自定义 header:
    @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);
    }