diff --git a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultConfigDatabaseBootstrapConfiguration.java b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultConfigDatabaseBootstrapConfiguration.java index 49008443..864bb21f 100644 --- a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultConfigDatabaseBootstrapConfiguration.java +++ b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultConfigDatabaseBootstrapConfiguration.java @@ -16,9 +16,8 @@ package org.springframework.cloud.vault.config.databases; -import java.util.HashMap; -import java.util.Map; - +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.vault.config.PropertyNameTransformer; @@ -27,9 +26,15 @@ import org.springframework.cloud.vault.config.SecretBackendMetadataFactory; import org.springframework.cloud.vault.config.VaultSecretBackendDescriptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; import org.springframework.util.Assert; import org.springframework.vault.core.util.PropertyTransformer; +import javax.annotation.PostConstruct; +import java.util.HashMap; +import java.util.Map; + /** * Bootstrap configuration providing support for the Database secret backends such as * Database, Apache Cassandra, Couchbase and MongoDB. @@ -38,13 +43,32 @@ import org.springframework.vault.core.util.PropertyTransformer; * @author Per Abich * @author Sebastien Nahelou * @author Francis Hitchens + * @author Quintin Beukes */ @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties({ VaultMySqlProperties.class, VaultPostgreSqlProperties.class, VaultCassandraProperties.class, VaultCouchbaseProperties.class, VaultMongoProperties.class, - VaultElasticsearchProperties.class, VaultDatabaseProperties.class }) + VaultElasticsearchProperties.class, VaultMultipleDatabaseProperties.class, VaultDatabaseProperties.class }) +@Order(Ordered.LOWEST_PRECEDENCE - 15) public class VaultConfigDatabaseBootstrapConfiguration { + @Autowired + private ConfigurableBeanFactory beanFactory; + + @Autowired + private VaultMultipleDatabaseProperties multipleDatabaseProperties; + + @PostConstruct + public void registerBeans() { + multipleDatabaseProperties.getDatabases().forEach(d -> { + String beanName = String.format("vaultMultipleDatabaseProperties_%s", + multipleDatabaseProperties.getDatabases().indexOf(d)); + if (!beanFactory.containsBean(beanName)) { + beanFactory.registerSingleton(beanName, d); + } + }); + } + @Bean @ConditionalOnMissingBean public DatabaseSecretBackendMetadataFactory databaseSecretBackendMetadataFactory() { diff --git a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMultipleDatabaseProperties.java b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMultipleDatabaseProperties.java new file mode 100644 index 00000000..fa2c8536 --- /dev/null +++ b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMultipleDatabaseProperties.java @@ -0,0 +1,44 @@ +/* + * Copyright 2016-2021 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.cloud.vault.config.databases; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +import java.util.ArrayList; +import java.util.List; + +/** + * Configuration properties for multiple database secrets using the Database backend. This + * is configured with the spring.cloud.vault.databases list. + * + * @author Quintin Beukes + * @since 3.0.3 + */ +@ConfigurationProperties("spring.cloud.vault") +public class VaultMultipleDatabaseProperties { + + private List databases = new ArrayList<>(); + + public List getDatabases() { + return databases; + } + + public void setDatabases(List databases) { + this.databases = databases; + } + +} diff --git a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMySqlProperties.java b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMySqlProperties.java index 60490071..05ccfcdb 100644 --- a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMySqlProperties.java +++ b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultMySqlProperties.java @@ -24,7 +24,8 @@ import org.springframework.lang.Nullable; * Configuration properties for Vault using the MySQL integration. * * @author Mark Paluch - * @deprecated since 2.0. Use {@link VaultDatabaseProperties}. + * @deprecated since 2.0. Use {@link VaultDatabaseProperties} or + * {@link VaultMultipleDatabaseProperties}. */ @ConfigurationProperties("spring.cloud.vault.mysql") @Deprecated diff --git a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultPostgreSqlProperties.java b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultPostgreSqlProperties.java index ea87552f..aa1b1ecd 100644 --- a/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultPostgreSqlProperties.java +++ b/spring-cloud-vault-config-databases/src/main/java/org/springframework/cloud/vault/config/databases/VaultPostgreSqlProperties.java @@ -23,7 +23,8 @@ import org.springframework.lang.Nullable; * Configuration properties for Vault using the PostgreSQL integration. * * @author Mark Paluch - * @deprecated since 2.0. Use {@link VaultDatabaseProperties}. + * @deprecated since 2.0. Use {@link VaultDatabaseProperties} or + * {@link VaultMultipleDatabaseProperties}. */ @ConfigurationProperties("spring.cloud.vault.postgresql") @Deprecated diff --git a/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultPropertySourceLocatorSupport.java b/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultPropertySourceLocatorSupport.java index 289ba8c9..22304330 100644 --- a/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultPropertySourceLocatorSupport.java +++ b/spring-cloud-vault-config/src/main/java/org/springframework/cloud/vault/config/VaultPropertySourceLocatorSupport.java @@ -119,7 +119,6 @@ public abstract class VaultPropertySourceLocatorSupport implements PropertySourc List> propertySources = new ArrayList<>(doCreateKeyValuePropertySources(environment)); for (SecretBackendMetadata backendAccessor : sorted) { - PropertySource vaultPropertySource = createVaultPropertySource(backendAccessor); propertySources.add(vaultPropertySource); }