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=trueorg.springframework.cloud:spring-cloud-starter-bootstrap
您可以通过设置 configuration 属性或包含依赖项来启用引导上下文。 使用 boostrap 上下文应该很少需要,因此我们建议使用 Config Data API,以便在属性源排序方面具有更大的灵活性。spring.cloud.bootstrap.enabled=trueorg.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 挂载的上下文路径为 ,可以使用上下文位置 () 或配置 VaultConfigurerPropertySourcevault:///my/context/path

上下文位置是指定和单独挂载的。 Spring Cloud Vault 将每个位置挂载为唯一的 . 您可以将默认位置与上下文位置(或其他配置系统)混合使用,以控制属性源的顺序。 如果要禁用默认键值路径计算并自行挂载每个键值后端,则此方法尤其有用。PropertySource

application.yml
spring.config.import: vault://first/context/path, vault://other/path, vault://

Spring 中的属性名称必须是唯一的,以避免阴影。 如果在不同的上下文路径中使用相同的机密名称,并且希望将这些名称公开为单个属性,则可以通过向位置添加查询参数来区分它们。Environmentprefix

例 1.application.yml
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://VaultAutoConfigurationVaultReactiveAutoConfigurationVaultConfigDataLoader

您可以通过使用 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