Polish and add tests.

Polish the code and add tests for SpringVaultClientConfiguration when
a namespace is configured.

Fixes gh-1589
This commit is contained in:
Scott Frederick
2020-03-30 14:13:49 -05:00
parent fedbee05db
commit 959f492ddf
2 changed files with 53 additions and 3 deletions

View File

@@ -130,11 +130,17 @@ public class SpringVaultClientConfiguration extends AbstractVaultConfiguration
return new SslConfiguration(keyStoreConfiguration, trustStoreConfiguration);
}
/**
* This method is a work-around for the Spring Vault issue documented in
* https://github.com/spring-projects/spring-vault/issues/546. The method should be
* removed when Spring Cloud Config is upgraded to the version of Spring Vault that
* includes the fix for the issue.
* @return the {@link RestOperations} to be used for Vault access
*/
@Override
public RestOperations restOperations() {
RestTemplate restOperations = (RestTemplate) super.restOperations();
applyNamespaceInterceptor(restOperations);
return restOperations;
return restTemplateBuilder(vaultEndpointProvider(),
clientHttpRequestFactoryWrapper().getClientHttpRequestFactory()).build();
}
private SslConfiguration.KeyStoreConfiguration getKeyStoreConfiguration(

View File

@@ -25,6 +25,7 @@ import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.context.annotation.UserConfigurations;
@@ -45,6 +46,10 @@ import org.springframework.cloud.config.server.environment.vault.authentication.
import org.springframework.cloud.config.server.environment.vault.authentication.PcfClientAuthenticationProvider;
import org.springframework.cloud.config.server.environment.vault.authentication.TokenClientAuthenticationProvider;
import org.springframework.core.io.ClassPathResource;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.mock.http.client.MockClientHttpRequest;
import org.springframework.util.ClassUtils;
import org.springframework.vault.authentication.AppRoleAuthentication;
import org.springframework.vault.authentication.AwsEc2Authentication;
@@ -58,8 +63,11 @@ import org.springframework.vault.authentication.GcpIamAuthentication;
import org.springframework.vault.authentication.KubernetesAuthentication;
import org.springframework.vault.authentication.PcfAuthentication;
import org.springframework.vault.authentication.TokenAuthentication;
import org.springframework.vault.client.VaultHttpHeaders;
import org.springframework.vault.support.SslConfiguration;
import org.springframework.vault.support.SslConfiguration.KeyStoreConfiguration;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.cloud.config.server.environment.VaultEnvironmentProperties.AuthenticationMethod.APPROLE;
@@ -280,6 +288,42 @@ class SpringVaultClientConfigurationTests {
.isEqualTo("password");
}
@Test
public void namespaceHeaderNotAddedWhenNamespaceNotConfigured() throws IOException {
VaultEnvironmentProperties properties = new VaultEnvironmentProperties();
SpringVaultClientConfiguration configuration = getConfiguration(properties);
HttpRequest request = invokeInterceptors(configuration.restOperations());
assertThat(request.getHeaders().getFirst(VaultHttpHeaders.VAULT_NAMESPACE))
.isNull();
}
@Test
public void namespaceInterceptorAddedWhenNamespaceConfigured() throws IOException {
VaultEnvironmentProperties properties = new VaultEnvironmentProperties();
properties.setNamespace("test-namespace");
SpringVaultClientConfiguration configuration = getConfiguration(properties);
HttpRequest request = invokeInterceptors(configuration.restOperations());
assertThat(request.getHeaders().getFirst(VaultHttpHeaders.VAULT_NAMESPACE))
.isEqualTo("test-namespace");
}
private HttpRequest invokeInterceptors(RestOperations restOperations)
throws IOException {
assertThat(restOperations).isInstanceOf(RestTemplate.class);
RestTemplate restTemplate = (RestTemplate) restOperations;
MockClientHttpRequest request = new MockClientHttpRequest();
ClientHttpRequestExecution execution = Mockito
.mock(ClientHttpRequestExecution.class);
byte[] body = new byte[] {};
for (ClientHttpRequestInterceptor interceptor : restTemplate.getInterceptors()) {
interceptor.intercept(request, body, execution);
}
return request;
}
private void assertClientAuthenticationOfType(VaultEnvironmentProperties properties,
Class<? extends ClientAuthentication> type) {
ClientAuthentication clientAuthentication = getConfiguration(properties)