ConfigData API

推荐使用 ConfigData API 替代以前的 Bootstrap 上下文,因为它提供了更灵活的配置来源顺序,允许指定要导入的配置系统和导入顺序。此外,文章介绍了 Vault 配置选项,例如配置位置、禁用 Vault 配置和定制基础设施类。

Spring Boot 从 2.4 版本开始提供 ConfigData API,允许声明配置源并将其导入为属性源。 从 3.0 版本开始,Spring Cloud Vault 使用 ConfigData API 将 Vault 的密钥后端装入为属性源。在之前的版本中,使用了 Bootstrap 上下文。ConfigData API 更加灵活,因为它允许指定要导入哪些配置系统以及按什么顺序导入。

你可以通过设置配置属性 spring.cloud.bootstrap.enabled=true 或包含依赖项 org.springframework.cloud:spring-cloud-starter-bootstrap 来启用引导上下文。使用引导上下文应该是非常罕见的,因此我们建议使用配置数据 API,以便在属性源排序方面有更大的灵活性。

ConfigData Locations

您可以通过一个或多个从 Vault 实质化的 PropertySource 装入 Vault 配置。Spring Cloud Vault 支持两个配置位置:

  • vault:// (default location)

  • vault:///<context-path> (contextual location)

使用默认位置挂载所有启用 Secret Backends 的属性源。如果没有进行进一步配置,Spring Cloud Vault 会在 /secret/${spring.application.name} 挂载键值后端。每个激活的配置文件都通过遵循 /secret/$\{spring.application.name}/${profile} 的格式添加另一个上下文路径。像 spring-cloud-config-databases 这样的其他模块添加到类路径后,会提供其他秘密后端配置选项,如果这些选项启用,会作为属性源进行挂载。

如果您希望控制从 Vault 作为`PropertySource`挂载的上下文路径,您可以使用上下文位置 (vault:///my/context/path) 或配置xref:secret-backends.adoc#vault.config.backends.configurer[VaultConfigurer)。

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

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

为避免阴影效应,Spring Environment 中的属性名称必须是唯一的。如果您在不同的上下文路径中使用相同的密钥名称,而且想要将它们公开为单独的属性,可以通过向位置添加 prefix 查询参数进行区分。

Example 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 返回的所有属性名称。如果你希望键名在键名和前缀之间用点号分隔,请确保向前缀添加一个尾随点号。

Conditionally enable/disable Vault Configuration

在某些情况下,可能需要在没有 Vault 的情况下启动应用程序。您可以通过位置字符串表示 Vault 配置位置应该是可选的还是强制的(默认):

  • optional:vault:// (default location)

  • optional:vault:///<context-path> (contextual location)

如果通过 spring.cloud.vault.enabled=false 禁用 Vault 支持,则在应用程序启动过程中会跳过可选位置。

将跳过无法找到的 Vault 上下文路径(HTTP 状态 404),无论配置位置是否标记为可选项。如果由于 HTTP 状态 404 而无法找到 Vault 上下文路径,Vault Client Fail Fast 允许在启动时失败。

Infrastructure Customization

Spring Cloud Vault 需要基础设施类与 Vault 交互。在不使用 ConfigData API(这意味着您没有指定 spring.config.import=vault:// 或上下文 Vault 路径)时,Spring Cloud Vault 会通过 VaultAutoConfigurationVaultReactiveAutoConfiguration 定义其 Bean。Spring Boot 在可用 Spring 上下文之前启动应用程序。因此,VaultConfigDataLoader 会自行注册 Bean,以便稍后将它们传播到应用程序上下文中。

您可以使用 Bootstrapper API 注册自定义实例来定制 Spring Cloud Vault 使用的基础设施:

Customizing 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));
Customizing 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));

有关自定义挂钩,另请参见 Customize which secret backends to expose as PropertySourceVaultConfigDataLoader 的来源。