DATAES-607 - Client-security-configuration.

Original PR: #293
This commit is contained in:
Peter-Josef Meisch 2019-07-13 10:33:23 +02:00 committed by GitHub
parent f5b4722b6b
commit eec55e273e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 90 additions and 1 deletions

View File

@ -29,6 +29,7 @@ import org.springframework.http.HttpHeaders;
* Configuration interface exposing common client configuration properties for Elasticsearch clients. * Configuration interface exposing common client configuration properties for Elasticsearch clients.
* *
* @author Mark Paluch * @author Mark Paluch
* @author Peter-Josef Meisch
* @since 3.2 * @since 3.2
*/ */
public interface ClientConfiguration { public interface ClientConfiguration {
@ -257,6 +258,15 @@ public interface ClientConfiguration {
*/ */
TerminalClientConfigurationBuilder withSocketTimeout(Duration timeout); TerminalClientConfigurationBuilder withSocketTimeout(Duration timeout);
/**
* Configure the username and password to be sent as a Basic Authentication header
*
* @param username the username. Must not be {@literal null}.
* @param password the password. Must not be {@literal null}.
* @return the {@link TerminalClientConfigurationBuilder}
*/
TerminalClientConfigurationBuilder withBasicAuth(String username, String password);
/** /**
* Build the {@link ClientConfiguration} object. * Build the {@link ClientConfiguration} object.
* *

View File

@ -36,6 +36,7 @@ import org.springframework.util.Assert;
* *
* @author Christoph Strobl * @author Christoph Strobl
* @author Mark Paluch * @author Mark Paluch
* @author Peter-Josef Meisch
* @since 3.2 * @since 3.2
*/ */
class ClientConfigurationBuilder class ClientConfigurationBuilder
@ -47,6 +48,8 @@ class ClientConfigurationBuilder
private @Nullable SSLContext sslContext; private @Nullable SSLContext sslContext;
private Duration connectTimeout = Duration.ofSeconds(10); private Duration connectTimeout = Duration.ofSeconds(10);
private Duration soTimeout = Duration.ofSeconds(5); private Duration soTimeout = Duration.ofSeconds(5);
private String username;
private String password;
/* /*
* (non-Javadoc) * (non-Javadoc)
@ -139,12 +142,31 @@ class ClientConfigurationBuilder
return this; return this;
} }
@Override
public TerminalClientConfigurationBuilder withBasicAuth(String username, String password) {
Assert.notNull(username, "username must not be null");
Assert.notNull(password, "password must not be null");
this.username = username;
this.password = password;
return this;
}
/* /*
* (non-Javadoc) * (non-Javadoc)
* @see org.springframework.data.elasticsearch.client.ClientConfiguration.ClientConfigurationBuilderWithOptionalDefaultHeaders#build() * @see org.springframework.data.elasticsearch.client.ClientConfiguration.ClientConfigurationBuilderWithOptionalDefaultHeaders#build()
*/ */
@Override @Override
public ClientConfiguration build() { public ClientConfiguration build() {
if (username != null && password != null) {
if (HttpHeaders.EMPTY.equals(headers)) {
headers = new HttpHeaders();
}
headers.setBasicAuth(username, password);
}
return new DefaultClientConfiguration(this.hosts, this.headers, this.useSsl, this.sslContext, this.soTimeout, return new DefaultClientConfiguration(this.hosts, this.headers, this.useSsl, this.sslContext, this.soTimeout,
this.connectTimeout); this.connectTimeout);
} }
@ -152,4 +174,5 @@ class ClientConfigurationBuilder
private static InetSocketAddress parse(String hostAndPort) { private static InetSocketAddress parse(String hostAndPort) {
return InetSocketAddressParser.parse(hostAndPort, ElasticsearchHost.DEFAULT_PORT); return InetSocketAddressParser.parse(hostAndPort, ElasticsearchHost.DEFAULT_PORT);
} }
} }

View File

@ -30,9 +30,12 @@ import org.springframework.http.HttpHeaders;
* Unit tests for {@link ClientConfiguration}. * Unit tests for {@link ClientConfiguration}.
* *
* @author Mark Paluch * @author Mark Paluch
* @author Peter-Josef Meisch
*/ */
public class ClientConfigurationUnitTests { public class ClientConfigurationUnitTests {
private static final String AUTHORIZATION_HEADER = "Authorization";
@Test // DATAES-488 @Test // DATAES-488
public void shouldCreateSimpleConfiguration() { public void shouldCreateSimpleConfiguration() {
@ -78,4 +81,45 @@ public class ClientConfigurationUnitTests {
assertThat(clientConfiguration.getConnectTimeout()).isEqualTo(Duration.ofSeconds(10)); assertThat(clientConfiguration.getConnectTimeout()).isEqualTo(Duration.ofSeconds(10));
assertThat(clientConfiguration.getSocketTimeout()).isEqualTo(Duration.ofSeconds(5)); assertThat(clientConfiguration.getSocketTimeout()).isEqualTo(Duration.ofSeconds(5));
} }
@Test // DATAES-607
public void shouldAddBasicAuthenticationHeaderWhenNoHeadersAreSet() {
final String username = "secretUser";
final String password = "secretPassword";
ClientConfiguration clientConfiguration = ClientConfiguration.builder() //
.connectedTo("foo", "bar") //
.withBasicAuth(username, password) //
.build();
assertThat(clientConfiguration.getDefaultHeaders().get(AUTHORIZATION_HEADER))
.containsOnly(buildBasicAuth(username, password));
}
@Test // DATAES-607
public void shouldAddBasicAuthenticationHeaderAndKeepHeaders() {
final String username = "secretUser";
final String password = "secretPassword";
HttpHeaders defaultHeaders = new HttpHeaders();
defaultHeaders.set("foo", "bar");
ClientConfiguration clientConfiguration = ClientConfiguration.builder() //
.connectedTo("foo", "bar") //
.withBasicAuth(username, password) //
.withDefaultHeaders(defaultHeaders).build();
final HttpHeaders httpHeaders = clientConfiguration.getDefaultHeaders();
assertThat(httpHeaders.get(AUTHORIZATION_HEADER)).containsOnly(buildBasicAuth(username, password));
assertThat(httpHeaders.get("foo")).containsOnly("bar");
}
private String buildBasicAuth(String username, String password) {
HttpHeaders headers = new HttpHeaders();
headers.setBasicAuth(username, password);
return headers.get(AUTHORIZATION_HEADER).get(0);
}
} }

View File

@ -1,5 +1,17 @@
/* /*
* (c) Copyright 2019 codecentric AG * Copyright 2019 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ */
package org.springframework.data.elasticsearch.utils; package org.springframework.data.elasticsearch.utils;