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
org.springframework.boot
spring-boot-starter
org.springframework.cloud
spring-cloud-starter-vault-config
org.springframework.cloud
spring-cloud-dependencies
2023.0.0
pom
import
⚙️ 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 |