Property Sources
Vault 可以用许多不同的方式。一个特定的用例是使用 Vault 来存储加密属性。Spring Vault 支持 Vault 作为属性源,以便使用 Spring’s {spring-framework-docs}core.html#beans-property-source-abstraction[属性源抽象] 获取配置属性。
您可以在其他属性源中引用存储在 Vault 中的属性,或使用 |
Spring Boot/Spring Cloud 用户可以受益于 Spring Cloud Vault 的配置集成,该集成在应用程序启动期间初始化各种属性源。 |
Registering VaultPropertySource
Spring Vault 提供 VaultPropertySource
,可与 Vault 一起使用来获取属性。它使用嵌套 data
元素来公开存储在 Vault 中的加密属性。
ConfigurableApplicationContext ctx = new GenericApplicationContext();
MutablePropertySources sources = ctx.getEnvironment().getPropertySources();
sources.addFirst(new VaultPropertySource(vaultTemplate, "secret/my-application"));
在上述代码中,已将 VaultPropertySource
添加到搜索中,并具有最高优先级。如果它包含“foo”属性,将在检测到任何其他 PropertySource
中的任何 foo
属性之前检测到它并返回它。MutablePropertySources
公开许多方法,允许精确地操作属性源集。
@VaultPropertySource
@VaultPropertySource
注释提供了一种方便且具有声明性的机制,用于向 Spring 的 Environment
中添加 PropertySource
,以与 @Configuration
类结合使用。
@VaultPropertySource
采用 secret/my-application
等 Vault 路径,并在 PropertySource
中公开存储在节点中的数据。@VaultPropertySource
支持为与租期关联的秘密(例如,mysql
后端的凭据)续约租期,并在终端租期到期后对凭据进行轮换。默认情况下,禁用续约租期。
{
// …
"data": {
"database": {
"password": ...
},
"user.name": ...,
}
// …
}
@VaultPropertySource
@Configuration
@VaultPropertySource("secret/my-application")
public class AppConfig {
@Autowired Environment env;
@Bean
public TestBean testBean() {
TestBean testBean = new TestBean();
testBean.setUser(env.getProperty("user.name"));
testBean.setPassword(env.getProperty("database.password"));
return testBean;
}
}
@VaultPropertySource
with credential rotation and prefix@Configuration
@VaultPropertySource(value = "aws/creds/s3-access",
propertyNamePrefix = "aws.",
renewal = Renewal.ROTATE)
public class AppConfig {
// provides aws.access_key and aws.secret_key properties
}
从 |
您可以使用 |
已在 @VaultPropertySource
路径中存在的任何 ${…}
占位符都使用已针对环境注册的属性源集进行解析,如下例所示:
@VaultPropertySource
path using placeholders@Configuration
@VaultPropertySource(value = "aws/creds/${my.placeholder:fallback/value}",
propertyNamePrefix = "aws.",
renewal = Renewal.ROTATE)
public class AppConfig {
}
假设 my.placeholder
位于已注册的某个属性源中(例如,系统属性或环境变量),则占位符将解析为相应的值。如果没有,则 fallback/value
用作默认值。如果未指定默认值且无法解析属性,则会引发 IllegalArgumentException
。
在某些情况下,使用 @VaultPropertySource
注解时,严格控制属性源顺序可能不可行或不切实际。例如,如果上面的 @Configuration
类是通过组件扫描注册的,那么顺序就很难预测。在这种情况(如果覆盖很重要)下,建议用户退回到使用编程属性源 API。请参阅 ConfigurableEnvironment
和 MutablePropertySources
以了解更多详情。