Spring Boot 从 2.4 版开始提供了一个 ConfigData API,该 API 允许声明配置源并将其作为属性源导入。
Spring Cloud Vault 从 3.0 版开始使用 ConfigData API 将 Vault 的机密后端挂载为属性源。 在以前的版本中,使用了 Bootstrap 上下文。 ConfigData API 更加灵活,因为它允许指定要导入的配置系统以及导入的顺序。
您可以通过设置 configuration 属性或包含依赖项来启用引导上下文。
使用 boostrap 上下文应该很少需要,因此我们建议使用 Config Data API,以便在属性源排序方面具有更大的灵活性。spring.cloud.bootstrap.enabled=true org.springframework.cloud:spring-cloud-starter-bootstrap |
您可以通过设置 configuration 属性或包含依赖项来启用引导上下文。
使用 boostrap 上下文应该很少需要,因此我们建议使用 Config Data API,以便在属性源排序方面具有更大的灵活性。spring.cloud.bootstrap.enabled=true org.springframework.cloud:spring-cloud-starter-bootstrap |
ConfigData 位置
您可以通过从 Vault 具体化的一个或多个 Vault 配置来装载 Vault 配置。
Spring Cloud Vault 支持两个配置位置:PropertySource
-
vault://
(默认位置) -
vault:///<context-path>
(上下文位置)
使用默认位置会挂载所有已启用的机密后端的属性源。
无需进一步配置,Spring Cloud Vault 将键值后端挂载在 。
每个激活的配置文件都会在表单 后添加另一个上下文路径。
向类路径添加更多模块(如 )可提供额外的机密后端配置选项,如果启用这些选项,这些选项将作为属性源装载。/secret/${spring.application.name}
/secret/$\{spring.application.name}/${profile}
spring-cloud-config-databases
如果要控制从 Vault 挂载的上下文路径为 ,可以使用上下文位置 () 或配置 VaultConfigurer
。PropertySource
vault:///my/context/path
上下文位置是指定和单独挂载的。
Spring Cloud Vault 将每个位置挂载为唯一的 .
您可以将默认位置与上下文位置(或其他配置系统)混合使用,以控制属性源的顺序。
如果要禁用默认键值路径计算并自行挂载每个键值后端,则此方法尤其有用。PropertySource
spring.config.import: vault://first/context/path, vault://other/path, vault://
Spring 中的属性名称必须是唯一的,以避免阴影。
如果在不同的上下文路径中使用相同的机密名称,并且希望将这些名称公开为单个属性,则可以通过向位置添加查询参数来区分它们。Environment
prefix
spring.config.import: vault://my/path?prefix=foo., vault://my/other/path?prefix=bar.
secret: ${foo.secret}
other.secret: ${bar.secret}
前缀将按原样添加到Vault返回的所有属性名称中。如果希望键名称在前缀和键名称之间用点分隔,请确保在前缀中添加尾随点。 |
前缀将按原样添加到Vault返回的所有属性名称中。如果希望键名称在前缀和键名称之间用点分隔,请确保在前缀中添加尾随点。 |
有条件地启用/禁用 Vault 配置
在某些情况下,可能需要在没有保险柜的情况下启动应用程序。您可以通过位置字符串来表示 Vault 配置位置是可选的还是必需的(默认):
-
optional:vault://
(默认位置) -
optional:vault:///<context-path>
(上下文位置)
如果通过 禁用了 Vault 支持,则在应用程序启动期间会跳过可选位置。spring.cloud.vault.enabled=false
无论配置位置是否标记为可选,都会跳过找不到的 Vault 上下文路径(HTTP 状态 404)。如果由于 HTTP 状态 404 而找不到 Vault 上下文路径,则 Vault 客户端快速失败允许启动失败。 |
无论配置位置是否标记为可选,都会跳过找不到的 Vault 上下文路径(HTTP 状态 404)。如果由于 HTTP 状态 404 而找不到 Vault 上下文路径,则 Vault 客户端快速失败允许启动失败。 |
基础架构定制
Spring Cloud Vault 需要基础架构类才能与 Vault 交互。当不使用 ConfigData API 时(意味着您尚未指定或上下文 Vault 路径),Spring Cloud Vault 会通过 和 定义其 bean 。
Spring Boot 在 Spring Context 可用之前引导应用程序。因此,注册 Bean 本身,以便稍后将这些 Bean 传播到应用程序上下文中。spring.config.import=vault://
VaultAutoConfiguration
VaultReactiveAutoConfiguration
VaultConfigDataLoader
您可以通过使用 API 注册自定义实例来自定义 Spring Cloud Vault 使用的基础架构:Bootstrapper
ClientHttpRequestFactory
ClientOptions options = new ClientOptions();
SslConfiguration sslConfiguration = SslConfiguration.unconfigured();
HttpClientBuilder builder = HttpComponents.getHttpClientBuilder(options, sslConfiguration);
InstanceSupplier<ClientFactoryWrapper> supplier = context ->
new ClientFactoryWrapper(new HttpComponentsClientHttpRequestFactory(builder.build()));
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(ClientFactoryWrapper.class, supplier));
RestTemplateBuilder
InstanceSupplier<RestTemplateBuilder> supplier = context -> {
return RestTemplateBuilder
.builder()
.requestFactory(context.get(ClientFactoryWrapper.class).getClientHttpRequestFactory())
.defaultHeader("X-Vault-Namespace", "my-namespace");
};
SpringApplication application = new SpringApplication(MyApplication.class);
application.addBootstrapRegistryInitializer(registry -> registry.register(RestTemplateBuilder.class, supplier));
另请参阅自定义要公开为 PropertySource 的机密后端以及自定义挂钩的源。VaultConfigDataLoader