From e25463b6fba0003c76be8de89a6e83387afd0cf3 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Fri, 20 Jun 2025 18:01:30 +0200 Subject: [PATCH 1/2] adding apikey to elastic config Signed-off-by: Laura Trotta --- .../ElasticsearchConnectionDetails.java | 4 ++++ .../ElasticsearchProperties.java | 13 ++++++++++++ ...ElasticsearchRestClientConfigurations.java | 12 +++++++++++ ...earchRestClientAutoConfigurationTests.java | 20 +++++++++++++++++++ 4 files changed, 49 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchConnectionDetails.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchConnectionDetails.java index eef66ee7cc5f..ab1db084c8ab 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchConnectionDetails.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchConnectionDetails.java @@ -55,6 +55,10 @@ default String getPassword() { return null; } + default String getAPIKey() { + return null; + } + /** * Prefix added to the path of every request sent to Elasticsearch. * @return prefix added to the path of every request sent to Elasticsearch or diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java index a0325023aeb3..54b845324697 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchProperties.java @@ -46,6 +46,10 @@ public class ElasticsearchProperties { * Password for authentication with Elasticsearch. */ private String password; + /** + * APIKey for authentication with Elasticsearch. + */ + private String APIKey; /** * Connection timeout used when communicating with Elasticsearch. @@ -93,6 +97,15 @@ public void setPassword(String password) { this.password = password; } + public String getAPIKey() { + return this.APIKey; + } + + public void setAPIKey(String APIKey) { + this.APIKey = APIKey; + } + + public Duration getConnectionTimeout() { return this.connectionTimeout; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java index 79cd46cdb0e8..523b3a8f0ab8 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java @@ -24,6 +24,7 @@ import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; +import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; @@ -32,6 +33,7 @@ import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.nio.client.HttpAsyncClientBuilder; import org.apache.http.impl.nio.reactor.IOReactorConfig; +import org.apache.http.message.BasicHeader; import org.apache.http.nio.conn.ssl.SSLIOSessionStrategy; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; @@ -94,6 +96,11 @@ RestClientBuilder elasticsearchRestClientBuilder(ElasticsearchConnectionDetails .stream() .map((node) -> new HttpHost(node.hostname(), node.port(), node.protocol().getScheme())) .toArray(HttpHost[]::new)); + if (connectionDetails.getAPIKey() != null) { + builder.setDefaultHeaders(new Header[]{ + new BasicHeader("Authorization", "ApiKey " + connectionDetails.getAPIKey()), + }); + } builder.setHttpClientConfigCallback((httpClientBuilder) -> { builderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(httpClientBuilder)); SslBundle sslBundle = connectionDetails.getSslBundle(); @@ -260,6 +267,11 @@ public String getPassword() { return this.properties.getPassword(); } + @Override + public String getAPIKey() { + return this.properties.getAPIKey(); + } + @Override public String getPathPrefix() { return this.properties.getPathPrefix(); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java index ffd4acd6cbd9..5d3cd673c769 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java @@ -19,7 +19,9 @@ import java.time.Duration; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import org.apache.http.Header; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; import org.apache.http.auth.Credentials; @@ -128,6 +130,24 @@ void configureUriWithNoScheme() { }); } + @Test + void configureUriWithAPiKey() { + this.contextRunner.withPropertyValues("spring.elasticsearch.uris=http://user@localhost:9200","spring.elasticsearch.apikey=some-apiKey").run((context) -> { + RestClient client = context.getBean(RestClient.class); + assertThat(client.getNodes().stream().map(Node::getHost).map(HttpHost::toString)) + .containsExactly("http://localhost:9200"); + assertThat(client) + .extracting("defaultHeaders", InstanceOfAssertFactories.list(Header.class)) + .satisfies(( defaultHeaders) -> { + Optional authHeader = defaultHeaders.stream() + .filter(x -> x.getName().equals("Authorization")) + .findFirst(); + assertThat(authHeader).isPresent(); + assertThat(authHeader.get().getValue()).isEqualTo("ApiKey some-apiKey"); + }); + }); + } + @Test void configureUriWithUsernameOnly() { this.contextRunner.withPropertyValues("spring.elasticsearch.uris=http://user@localhost:9200").run((context) -> { From e00035067b2b038590115dcfd8a344cb4ae2e559 Mon Sep 17 00:00:00 2001 From: Laura Trotta Date: Mon, 23 Jun 2025 12:32:56 +0200 Subject: [PATCH 2/2] author add Signed-off-by: Laura Trotta --- .../elasticsearch/ElasticsearchRestClientConfigurations.java | 1 + .../ElasticsearchRestClientAutoConfigurationTests.java | 1 + 2 files changed, 2 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java index 523b3a8f0ab8..9b4541498f84 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientConfigurations.java @@ -64,6 +64,7 @@ * @author Moritz Halbritter * @author Andy Wilkinson * @author Phillip Webb + * @author Laura Trotta */ class ElasticsearchRestClientConfigurations { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java index 5d3cd673c769..c71399f88dde 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/elasticsearch/ElasticsearchRestClientAutoConfigurationTests.java @@ -62,6 +62,7 @@ * @author Andy Wilkinson * @author Moritz Halbritter * @author Phillip Webb + * @author Laura Trotta */ class ElasticsearchRestClientAutoConfigurationTests {