This guide demonstrates how to configure a Spring Boot application to use HashiCorp Vault for secrets in remote environments (e.g., prod
, staging
, integration
) while avoiding Vault entirely in local environments (dev
, test
), using only one main configuration file and minimal profile-specific overrides.
β Goals
- Use only one main
application.properties
file - Avoid Vault in
dev
andtest
profiles - Enable Vault by default for all other environments
- Support dynamic Vault paths like
secret/prod/vault-demo
- Manage Vault and Spring behavior with environment variables
- Provide launcher classes for local testing with
dev
ortest
profile
π¦ Maven Dependencies
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
βοΈ Properties Files
β
application.properties
(Default for remote environments)
spring.application.name=vault-demo
# Vault is enabled by default (for remote)
spring.cloud.vault.authentication=token
spring.cloud.vault.token=${VAULT_TOKEN}
spring.cloud.vault.kv.enabled=true
spring.cloud.vault.kv.backend=secret
spring.cloud.vault.kv.application-name=${VAULT_ENV}/vault-demo
spring.cloud.vault.uri=${VAULT_URI}
β application-dev.properties
spring.cloud.vault.enabled=false
my.secret.property=local-dev-value
β application-test.properties
spring.cloud.vault.enabled=false
my.secret.property=local-test-value
π§ Run Examples
β Remote (Vault-enabled)
export VAULT_ENV=prod
export VAULT_URI=https://vault.company.com
export VAULT_TOKEN=your-token
./mvnw spring-boot:run
π§ͺ Local Dev Profile
./mvnw spring-boot:run -Dspring.profiles.active=dev
π Accessing Secrets in Code
@Value("${my.secret.property}")
private String secretValue;
Or:
@ConfigurationProperties(prefix = "my.secret")
public class SecretConfig {
private String property;
// Getters and setters
}
π§ Summary
Environment | Profile | Vault Used | Vault Path |
---|---|---|---|
dev |
dev |
β No | N/A |
test |
test |
β No | N/A |
integration |
(none) | β Yes | secret/integration/vault-demo |
staging |
(none) | β Yes | secret/staging/vault-demo |
prod |
(none) | β Yes | secret/prod/vault-demo |
β Environment Variable Reference
Variable | Purpose | Example |
---|---|---|
SPRING_PROFILES_ACTIVE |
Activates local profile (dev , test ) |
dev , test
|
VAULT_ENV |
Remote Vault env name (prod, staging) |
prod , staging , integration
|
VAULT_URI |
Vault endpoint | https://vault.company.com |
VAULT_TOKEN |
Vault token for authentication | s.XXXXXXXXXXXX |
Top comments (0)