4. 配置数据 API

Spring Boot 从 2.4 版开始提供了一个 ConfigData API,允许声明配置源并将其导入为属性源。spring-doc.cadn.net.cn

Spring Cloud Vault 从 3.0 版开始使用 ConfigData API 将 Vault 的秘密后端挂载为属性源。 在以前的版本中,使用了 Bootstrap 上下文。 ConfigData API 更加灵活,因为它允许指定要导入的配置系统以及导入的顺序。spring-doc.cadn.net.cn

您可以通过设置配置属性来启用引导上下文spring.cloud.bootstrap.enabled=true或通过包含依赖项org.springframework.cloud:spring-cloud-starter-bootstrap. 很少需要使用 boostrap 上下文,因此我们建议使用 Config Data API,以便在属性源排序方面更加灵活。

4.1. ConfigData 位置

您可以通过一个或多个挂载 Vault 配置PropertySource从 Vault 具体化。 Spring Cloud Vault 支持两个配置位置:spring-doc.cadn.net.cn

使用默认位置会挂载所有已启用的机密后端的属性源。 无需进一步配置,Spring Cloud Vault 将键值后端挂载在/secret/${spring.application.name}. 每个激活的配置文件都会在表单后添加另一个上下文路径/secret/${spring.application.name}/${profile}. 向类路径添加更多模块,例如spring-cloud-config-databases,提供了其他机密后端配置选项,如果启用,这些选项将作为属性源挂载。spring-doc.cadn.net.cn

如果要控制哪些上下文路径从 Vault 挂载为PropertySource,您可以使用上下文位置 (vault:///my/context/path) 或配置VaultConfigurer.spring-doc.cadn.net.cn

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

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

弹簧中的属性名称Environment必须是唯一的以避免阴影。 如果您在不同的上下文路径中使用相同的密钥名称,并且希望将它们公开为单独的属性,您可以通过添加prefixquery 参数添加到该位置。spring-doc.cadn.net.cn

示例 5.application.yml
spring.config.import: vault://my/path?prefix=foo., vault://my/other/path?prefix=bar.
secret: ${foo.secret}
other.secret: ${bar.secret}
前缀按原样添加到 Vault 返回的所有属性名称中。如果希望键名称在前缀和键名称之间用点分隔,请确保在前缀中添加一个尾随点。

4.2. 有条件地启用/禁用 Vault 配置

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

如果通过spring.cloud.vault.enabled=false.spring-doc.cadn.net.cn

无论配置位置是否标记为可选,都将跳过找不到的 Vault 上下文路径(HTTP 状态 404)。如果由于 HTTP 状态 404 而找不到 Vault 上下文路径,则 Vault 客户端快速故障允许在启动时失败。

4.3. 基础设施定制

Spring Cloud Vault 需要基础设施类才能与 Vault 交互。不使用 ConfigData API 时(意味着您尚未指定spring.config.import=vault://或上下文 Vault 路径),Spring Cloud Vault 通过VaultAutoConfigurationVaultReactiveAutoConfiguration. Spring Boot 在 Spring Context 可用之前引导应用程序。因此VaultConfigDataLoader注册 bean 本身,以便稍后将它们传播到应用程序上下文中。spring-doc.cadn.net.cn

您可以通过使用Bootstrapper应用程序接口:spring-doc.cadn.net.cn

示例 6.定制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));
示例 7.定制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用于定制挂钩。spring-doc.cadn.net.cn