此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Vault 3.1.2spring-doc.cn

VaultTemplate 简介

VaultTemplate 位于软件包 是 Spring 的 Vault 支持的中心类,它提供了丰富的功能集 与 Vault 交互。该模板提供了方便的读取、写入和 删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。org.springframework.vault.corespring-doc.cn

配置后,VaultTemplate 是线程安全的,并且可以在 多个实例。

Vault 文档和域类之间的映射是通过委托 来完成的。Spring Web 支持提供了映射基础结构。RestTemplatespring-doc.cn

VaultTemplate 类实现接口 VaultOperationsVaultOperations 上的方法尽可能以 methods 命名 在 Vault API 上提供,以使现有 Vault 开发人员熟悉 API 他们习惯了 API 和 CLI。例如,您将找到诸如 “write”、“delete”、“read” 和 “revoke”。 设计目标是尽可能轻松地在 使用 Vault API 和 .两者之间的主要区别 这两个 API 是可以传递域对象而不是 JSON 键值对。VaultOperationsVaultOperationsspring-doc.cn

引用 VaultTemplate 实例上的操作的首选方式 通过其接口 VaultOperations 进行。

虽然有许多方便的方法可以轻松帮助您 如果您需要直接访问 Vault API 以访问 功能未明确公开的 你可以使用 多个 execute 回调方法以访问底层 API。执行回调 将为您提供对对象的引用。 有关更多信息,请参阅 执行回调 部分。VaultTemplateVaultTemplateRestOperationsspring-doc.cn

现在让我们看看如何在 Spring 容器的上下文中使用 Vault 的示例。spring-doc.cn

注册和配置 Spring Vault bean

使用 Spring Vault 不需要 Spring Context。但是,在托管上下文中注册的 和 SessionManager 的实例将参与其中 在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处理活动的 Vault 会话非常有用 应用程序关闭。您还可以在应用程序中重复使用同一实例。VaultTemplateVaultTemplatespring-doc.cn

Spring Vault 附带了一个支持 bean 定义的配置类 在 Spring 上下文中使用。应用程序配置 类通常从 AbstractVaultConfiguration 扩展而来,并且需要 提供特定于环境的其他详细信息。spring-doc.cn

AbstractVaultConfiguration 扩展需要 implement 和 methods。VaultEndpoint vaultEndpoint()ClientAuthentication clientAuthentication()spring-doc.cn

示例 1.使用基于 Java 的 bean 元数据注册 Spring Vault 对象
@Configuration
public class AppConfig extends AbstractVaultConfiguration {

    /**
     * Specify an endpoint for connecting to Vault.
     */
    @Override
    public VaultEndpoint vaultEndpoint() {
        return new VaultEndpoint();                            (1)
    }

    /**
     * Configure a client authentication.
     * Please consider a more secure authentication method
     * for production use.
     */
    @Override
    public ClientAuthentication clientAuthentication() {
        return new TokenAuthentication("…");                   (2)
    }
}
1 创建一个默认指向 .https://localhost:8200
2 此示例使用 TokenAuthentication 快速入门。 有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。
示例 2.注册 Spring Vault 应用注入的属性
@Configuration
public class AppConfig extends AbstractVaultConfiguration {

    @Value("${vault.uri}")
    URI vaultUri;

    /**
     * Specify an endpoint that was injected as URI.
     */
    @Override
    public VaultEndpoint vaultEndpoint() {
        return VaultEndpoint.from(vaultUri);                          (1)
    }

    /**
     * Configure a Client Certificate authentication.
     * {@link RestOperations} can be obtained from {@link #restOperations()}.
     */
    @Override
    public ClientAuthentication clientAuthentication() {
        return new ClientCertificateAuthentication(restOperations()); (2)
    }
}
1 VaultEndpoint 可以使用各种工厂方法(如 或 )进行构造。from(URI uri)VaultEndpoint.create(String host, int port)
2 方法的依赖项可以从您的配置中获得,也可以由您的配置提供。ClientAuthenticationAbstractVaultConfiguration
在某些情况下,创建自定义配置类可能会很麻烦。 查看允许使用 来自现有属性源的属性和 Spring 的 .阅读更多 在使用 EnvironmentVaultConfiguration 中。Environment

会话管理

Spring Vault 需要 登录和访问 Vault。 有关身份验证的详细信息,请参阅 [vault.core.authentication]。 Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但 必须在整个会话中重复使用。这方面由 implementation 处理。A 决定它的频率 获取 Token,关于 Revocation 和 Renewal。Spring Vault 带有两个实现:ClientAuthenticationSessionManagerSessionManagerspring-doc.cn

EnvironmentVaultConfiguration

Spring Vault 包括 EnvironmentVaultConfiguration从 Spring 和 Spring 的一组预定义的 Vault 客户端配置 属性键。EnvironmentVaultConfiguration 支持频繁应用的配置。通过从最合适的配置类派生来支持其他配置。 将 EnvironmentVaultConfiguration 与现有 基于 Java 的配置类,并通过 Spring 的任何 s.Environment@Import(EnvironmentVaultConfiguration.class)PropertySourcespring-doc.cn

例 3.将 EnvironmentVaultConfiguration 与属性文件一起使用
基于 Java 的配置类
@PropertySource("vault.properties")
@Import(EnvironmentVaultConfiguration.class)
public class MyConfiguration{
}
vault.properties
vault.uri=https://localhost:8200
vault.token=00000000-0000-0000-0000-000000000000

属性键spring-doc.cn

  • Vault URI:vault.urispring-doc.cn

  • SSL 配置spring-doc.cn

    • 密钥库资源:(可选)vault.ssl.key-storespring-doc.cn

    • 密钥库密码:(可选)vault.ssl.key-store-passwordspring-doc.cn

    • 密钥库类型:(可选,通常,还支持vault.ssl.key-store-typejkspem)spring-doc.cn

    • 信任库资源:(可选)vault.ssl.trust-storespring-doc.cn

    • 信任库密码:(可选)vault.ssl.trust-store-passwordspring-doc.cn

    • 信任库类型:(可选,通常,还支持vault.ssl.trust-store-typejkspem)spring-doc.cn

    • 已启用的 SSL/TLS 协议:(自 2.3.2 起,可选,协议以逗号分隔)vault.ssl.enabled-protocolsspring-doc.cn

    • 已启用 SSL/TLS 密码套件:(自 2.3.2 起,可选,密码套件以逗号分隔)vault.ssl.enabled-cipher-suitesspring-doc.cn

  • 身份验证方法:(默认为 ,支持的身份验证方法包括:、、vault.authenticationTOKENTOKENAPPIDAPPROLEAWS_EC2AWS_IAMAZURECERTCUBBYHOLEKUBERNETES)spring-doc.cn

特定于身份验证的属性键spring-doc.cn

  • AppId 路径:(默认为vault.app-id.app-id-pathapp-id)spring-doc.cn

  • AppId 中:vault.app-id.app-idspring-doc.cn

  • UserId: . 并使用相应的用户 ID 机制。 任何其他值都与 一起使用。vault.app-id.user-idMAC_ADDRESSIP_ADDRESSMacAddressUserIdIpAddressUserIdStaticUserIdspring-doc.cn

无配置选项。spring-doc.cn

  • Kubernetes path:(默认为vault.kubernetes.kubernetes-pathkubernetes)spring-doc.cn

  • 角色:vault.kubernetes.rolespring-doc.cn

  • 服务帐户令牌文件的路径:(默认为vault.kubernetes.service-account-token-file/var/run/secrets/kubernetes.io/serviceaccount/token)spring-doc.cn

执行回调

所有 Spring 模板类的一个共同设计特征是所有功能都路由到模板执行回调方法之一。 这有助于确保异常和可能需要的任何资源管理的执行一致性。 虽然在 JDBC 和 JMS 的情况下,这比在 Vault 中的需求要大得多,但它仍然提供了一个访问和日志记录的单一位置。 因此,使用 execute 回调是访问 Vault API 的首选方式 来执行我们尚未在 VaultTemplate 上作为方法公开的不常见操作。spring-doc.cn

以下是 execute 回调方法的列表。spring-doc.cn

  • <T> T doWithVault 执行给定的 ,允许使用 与 Vault 交互,而无需会话。(RestOperationsCallback<T> callback)RestOperationsCallbackRestOperationsspring-doc.cn

  • <T> T doWithSession 会话 执行给定的 ,允许在经过身份验证的会话中与 Vault 进行交互。(RestOperationsCallback<T> callback)RestOperationsCallbackspring-doc.cn

下面是一个使用 初始化 Vault 的示例:ClientCallbackspring-doc.cn

vaultOperations.doWithVault(new RestOperationsCallback<VaultInitializationResponse>() {

  @Override
  public VaultInitializationResponse doWithRestOperations(RestOperations restOperations) {

    ResponseEntity<VaultInitializationResponse> exchange = restOperations
                       .exchange("/sys/init", HttpMethod.PUT,
                                 new HttpEntity<Object>(request),
                                 VaultInitializationResponse.class);

    return exchange.getBody();
    }
});