Makes SpringVaultClientConfiguration an @Configuration.

AbstractVaultConfiguration assumes that the implementing class is a cglib proxy (which `@Configuration` classes are).

Fixes gh-1556
This commit is contained in:
Spencer Gibb
2020-03-18 12:54:32 -04:00
parent 8ce0201c3e
commit 7ad34fdee5
3 changed files with 37 additions and 13 deletions

View File

@@ -71,7 +71,6 @@ import org.springframework.cloud.config.server.environment.SvnKitEnvironmentRepo
import org.springframework.cloud.config.server.environment.VaultEnvironmentProperties;
import org.springframework.cloud.config.server.environment.VaultEnvironmentRepository;
import org.springframework.cloud.config.server.environment.VaultEnvironmentRepositoryFactory;
import org.springframework.cloud.config.server.environment.vault.SpringVaultClientAuthenticationProvider;
import org.springframework.cloud.config.server.environment.vault.SpringVaultClientConfiguration;
import org.springframework.cloud.config.server.environment.vault.SpringVaultEnvironmentRepository;
import org.springframework.cloud.config.server.environment.vault.SpringVaultEnvironmentRepositoryFactory;
@@ -239,17 +238,9 @@ public class EnvironmentRepositoryConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(VaultTemplate.class)
@Import(SpringVaultClientConfiguration.class)
static class SpringVaultFactoryConfig {
@Bean
public SpringVaultClientConfiguration vaultClientConfiguration(
VaultEnvironmentProperties vaultProperties,
ConfigTokenProvider tokenProvider,
List<SpringVaultClientAuthenticationProvider> authProviders) {
return new SpringVaultClientConfiguration(vaultProperties, tokenProvider,
authProviders);
}
@Bean
public SpringVaultEnvironmentRepositoryFactory vaultEnvironmentRepositoryFactory(
ObjectProvider<HttpServletRequest> request, EnvironmentWatch watch,

View File

@@ -22,9 +22,11 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.cloud.config.server.environment.ConfigTokenProvider;
import org.springframework.cloud.config.server.environment.VaultEnvironmentProperties;
import org.springframework.cloud.config.server.environment.VaultEnvironmentProperties.AuthenticationMethod;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.util.StringUtils;
@@ -51,7 +53,9 @@ import org.springframework.web.util.UriComponentsBuilder;
*
* @author Scott Frederick
*/
public class SpringVaultClientConfiguration extends AbstractVaultConfiguration {
@Configuration
public class SpringVaultClientConfiguration extends AbstractVaultConfiguration
implements InitializingBean {
private static final String VAULT_PROPERTIES_PREFIX = "spring.cloud.config.server.vault.";
@@ -59,7 +63,7 @@ public class SpringVaultClientConfiguration extends AbstractVaultConfiguration {
private final ConfigTokenProvider configTokenProvider;
private final RestOperations externalRestOperations;
private RestOperations externalRestOperations;
private final Log log = LogFactory.getLog(getClass());
@@ -72,7 +76,10 @@ public class SpringVaultClientConfiguration extends AbstractVaultConfiguration {
this.vaultProperties = vaultProperties;
this.configTokenProvider = configTokenProvider;
this.authProviders = authProviders;
}
@Override
public void afterPropertiesSet() {
this.externalRestOperations = new RestTemplate(
clientHttpRequestFactoryWrapper().getClientHttpRequestFactory());
}

View File

@@ -26,6 +26,11 @@ import java.util.List;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.context.annotation.UserConfigurations;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.cloud.config.server.config.ConfigServerAutoConfiguration;
import org.springframework.cloud.config.server.config.ConfigServerConfiguration;
import org.springframework.cloud.config.server.environment.VaultEnvironmentProperties;
import org.springframework.cloud.config.server.environment.vault.SpringVaultClientConfiguration.ConfigTokenProviderAuthentication;
import org.springframework.cloud.config.server.environment.vault.authentication.AppRoleClientAuthenticationProvider;
@@ -40,6 +45,7 @@ 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.util.ClassUtils;
import org.springframework.vault.authentication.AppRoleAuthentication;
import org.springframework.vault.authentication.AwsEc2Authentication;
import org.springframework.vault.authentication.AwsIamAuthentication;
@@ -284,11 +290,31 @@ class SpringVaultClientConfigurationTests {
private SpringVaultClientConfiguration getConfiguration(
VaultEnvironmentProperties properties) {
return new SpringVaultClientConfiguration(properties, () -> null, authProviders);
SpringVaultClientConfiguration configuration = new SpringVaultClientConfiguration(
properties, () -> null, authProviders);
configuration.afterPropertiesSet();
return configuration;
}
private String base64(String value) {
return new String(Base64.getEncoder().encode(value.getBytes()));
}
@Test
@SuppressWarnings("deprecation")
public void springVaultClientConfigurationIsAProxy() {
new WebApplicationContextRunner()
.withPropertyValues("spring.profiles.active=vault")
.withConfiguration(UserConfigurations.of(ConfigServerConfiguration.class))
.withConfiguration(
AutoConfigurations.of(ConfigServerAutoConfiguration.class))
.run(context -> {
assertThat(context).getBean(SpringVaultClientConfiguration.class)
.isNotNull()
.matches(svcc -> ClassUtils
.isCglibProxyClassName(svcc.getClass().getName()),
"is a proxy");
});
}
}