如何配置@ConfigurationProperties正确读取Hashicorp Vault密钥
我已启动Hashicorp Vault,密钥存储路径为secret/demo-app/keycloak,该路径下包含两个密钥值:clientId、clientSecret。
我已完成bootstrap.properties的配置,具体内容如下:
spring.application.name=demo-app spring.cloud.vault.token=00000000-0000-0000-0000-000000000000 spring.cloud.vault.scheme=http spring.cloud.vault.kv.enabled=true
但我没能找到正确方式,让同时标注@Data、@Configuration的配置类,通过@ConfigurationProperties在应用启动时读取上述密钥值,我的配置类代码如下:
@Data @Configuration @ConfigurationProperties("keycloak") public class Client { private String clientId; private String clientSecret; @PostConstruct public void init() { System.out.println("PostConstruct: " + this.toString()); } }
但该配置未生效,@PostConstruct方法的输出结果为:
PostConstruct: Client(clientId=null, clientSecret=null)
请问我遗漏了哪些配置步骤?
按以下要求补充排查配置即可解决问题:
适配KV v2版本的路径规则
当前Vault默认启用的KV密钥引擎为v2版本,原有配置未声明版本信息,会导致Spring Cloud Vault按v1规则拼接读取路径,无法匹配实际的密钥存储位置。需要在bootstrap.properties中补充以下配置:# 声明KV引擎为v2版本 spring.cloud.vault.kv.version=2 # 指定KV引擎的后端路径前缀 spring.cloud.vault.kv.backend=secret # 指定实际存储密钥的相对路径,Spring Cloud Vault会自动拼接v2版本要求的/data路径前缀,最终实际请求路径为`secret/data/demo-app/keycloak` spring.cloud.vault.kv.application-name=demo-app/keycloak匹配属性绑定的前缀规则
从Vault拉取到的clientId、clientSecret键值,默认会作为顶级配置属性注入Spring Environment,不会自动携带keycloak前缀,和你配置类上@ConfigurationProperties("keycloak")的绑定规则不匹配。两种调整方式二选一即可:- 去掉
@ConfigurationProperties的前缀参数,直接写为@ConfigurationProperties - 在
bootstrap.properties中补充配置,让拉取到的密钥自动拼接keycloak前缀:# 配置属性映射规则,给所有Vault拉取的键名自动加上keycloak.前缀 spring.cloud.vault.kv.mapping="#{'keycloak.' + key}"
- 去掉
确保Bootstrap上下文正常加载
Spring Cloud 2020.0及以上版本默认禁用了bootstrap上下文,若未引入对应依赖,bootstrap.properties中的Vault配置不会在应用启动早期生效,会导致配置类初始化时Vault的密钥还未加载到Environment中,最终拿到空值。需要补充引入依赖:<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>校验配置类的绑定扫描规则
确保配置类被@ConfigurationPropertiesScan注解扫描到,或在配置类所在模块的启动类上标注@ConfigurationPropertiesScan(basePackages = "你的配置类所在包路径"),避免属性绑定逻辑被Spring容器跳过。
内容的提问来源于stack exchange,提问作者stacktrace2234

