类,位于包中, 是 Spring 的 Vault 支持的核心类,提供丰富的功能集 与 Vault 交互。该模板提供了读取、写入和 删除 Vault 中的数据,并提供域对象和 Vault 数据之间的映射。VaultTemplateorg.springframework.vault.core

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

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

该类实现接口 。 在尽可能的情况下,上的方法都以方法命名 在 Vault API 上可用,使现有 Vault 开发人员熟悉 API 习惯了 API 和 CLI 的人。例如,您将找到诸如 “写入”、“删除”、“读取”和“撤销”。 设计目标是尽可能轻松地在 Vault API 的使用和 .两者之间的主要区别 这两个 API 是可以传递域对象而不是 JSON 键值对。VaultTemplateVaultOperationsVaultOperationsVaultOperationsVaultOperations

引用实例上的操作的首选方式 是通过它的接口。VaultTemplateVaultOperations

虽然有许多方便的方法可以轻松帮助您 如果您需要直接访问 Vault API 才能访问,请执行常见任务 您可以使用以下之一的未显式公开的功能 多个执行回调方法来访问底层 API。execute 回调 将为您提供对对象的引用。 有关详细信息,请参阅执行回调部分。VaultTemplateVaultTemplateRestOperations

现在,让我们看一下如何在 Spring 容器的上下文中使用 Vault 的示例。

配置后,是线程安全的,可以跨 多个实例。VaultTemplate
引用实例上的操作的首选方式 是通过它的接口。VaultTemplateVaultOperations

注册和配置 Spring Vault bean

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

Spring Vault 附带了一个支持配置类,该类提供 Bean 定义 用于 Spring 上下文。应用程序配置 类通常扩展自 并且需要 提供特定于环境的其他详细信息。AbstractVaultConfiguration

从需求扩展到实现 “VaultEndpoint vaultEndpoint()”和方法。AbstractVaultConfigurationClientAuthentication clientAuthentication()

例 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 创建一个默认指向 的新建。VaultEndpointhttps://localhost:8200
2 此示例用于快速入门。 有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。TokenAuthentication
例 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 中。EnvironmentVaultConfigurationEnvironment
1 创建一个默认指向 的新建。VaultEndpointhttps://localhost:8200
2 此示例用于快速入门。 有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。TokenAuthentication
1 VaultEndpoint可以使用各种工厂方法(例如 或 .from(URI uri)VaultEndpoint.create(String host, int port)
2 方法可以从配置中获取方法的依赖关系,也可以由配置提供。ClientAuthenticationAbstractVaultConfiguration
在某些情况下,创建自定义配置类可能很麻烦。 看看允许使用 来自现有财产来源和 Spring 的 .阅读更多 在使用 EnvironmentVaultConfiguration 中。EnvironmentVaultConfigurationEnvironment

会话管理

Spring Vault 需要登录和访问 Vault。 有关身份验证的详细信息,请参阅 [vault.core.authentication]。 Vault 登录不应在每次经过身份验证的 Vault 交互中发生,但 必须在整个会话中重复使用。这方面由实现处理。A 决定多久一次 获取关于吊销和续订的令牌。Spring Vault 提供了两种实现:ClientAuthenticationSessionManagerSessionManager

  • SimpleSessionManager:仅从提供的令牌中获取令牌,无需刷新和吊销ClientAuthentication

  • LifecycleAwareSessionManager:这计划令牌 如果令牌可续期,则续订,并在处置时撤销登录令牌。 续订计划使用 . 如果使用 .SessionManagerAsyncTaskExecutorLifecycleAwareSessionManagerAbstractVaultConfiguration

EnvironmentVaultConfiguration

Spring Vault 包括从 Spring 配置 Vault 客户端和一组预定义的 属性键。 支持经常应用的配置。通过从最合适的配置类派生来支持其他配置。包括到现有 基于 Java 的配置类,并通过任何 Spring 的 s 提供配置属性。EnvironmentVaultConfigurationEnvironmentEnvironmentVaultConfigurationEnvironmentVaultConfiguration@Import(EnvironmentVaultConfiguration.class)PropertySource

例 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

属性键

  • 保管库 URI:vault.uri

  • SSL 配置

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

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

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

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

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

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

    • 已启用的 SSL/TLS 协议:(从 2.3.2 开始,可选,协议以逗号分隔)vault.ssl.enabled-protocols

    • 已启用的 SSL/TLS 密码套件:(从 2.3.2 开始,可选,密码套件以逗号分隔)vault.ssl.enabled-cipher-suites

  • 认证方式:(默认为 ,支持的认证方式有:、、、、vault.authenticationTOKENTOKENAPPIDAPPROLEAWS_EC2AWS_IAMAZURECERTCUBBYHOLEKUBERNETES)

特定于身份验证的属性键

  • Vault Token(金库令牌):vault.token

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

  • AppId:vault.app-id.app-id

  • 用户 Id:。 并使用 ,各自的用户 ID 机制。 任何其他值都与 一起使用。vault.app-id.user-idMAC_ADDRESSIP_ADDRESSMacAddressUserIdIpAddressUserIdStaticUserId

  • AppRole 路径:(默认为vault.app-role.app-role-pathapprole)

  • 角色 ID:vault.app-role.role-id

  • SecretId:(可选)vault.app-role.secret-id

  • AWS EC2 路径:(默认为vault.aws-ec2.aws-ec2-pathaws-ec2)

  • 角色:vault.aws-ec2.role

  • RoleId:(已弃用:改用)vault.aws-ec2.role-idvault.aws-ec2.role

  • 身份证件 URL:(默认为vault.aws-ec2.identity-document169.254.169.254/latest/dynamic/instance-identity/pkcs7)

  • 角色:vault.aws-iam.role

没有配置选项。

  • 初始保管库令牌:vault.token

  • Kubernetes 路径:(默认为vault.kubernetes.kubernetes-pathkubernetes)

  • 角色:vault.kubernetes.role

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

执行回调

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

下面是执行回调方法的列表。

  • <T> T doWithVault 执行给定的,允许在不需要会话的情况下与Vault进行交互。(RestOperationsCallback<T> callback)RestOperationsCallbackRestOperations

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

下面是一个使用 初始化 Vault 的示例:ClientCallback

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();
    }
});