| 此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Vault 3.2.0! | 
VaultTemplate 简介
班级VaultTemplate,位于包中org.springframework.vault.core,
是 Spring 的 Vault 支持的核心类,提供丰富的功能集
与 Vault 交互。该模板提供了方便的读取、写入和作
删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。
| 配置完成后, VaultTemplate是线程安全的,可以跨
多个实例。 | 
Vault 文档和域类之间的映射是通过委托给RestTemplate.Spring Web 支持提供了映射基础设施。
这VaultTemplateclass 实现接口VaultOperations.
在尽可能多的方法中VaultOperations以方法命名
在 Vault API 上可用,以使现有 Vault 开发人员熟悉该 API
他们习惯了 API 和 CLI。例如,您会发现诸如
“写入”、“删除”、“读取”和“撤销”。
设计目标是尽可能轻松地在
Vault API 的使用和VaultOperations.两者之间的主要区别
这两个 API 是VaultOperations可以传递域对象,而不是
JSON 键值对。
用于VaultTemplate(以及从那里访问的接口)被考虑
相对于VaultEndpoint.可以使用完全限定的 URI 路径
以访问经过身份验证的上下文中的 Vault 集群成员。防止不需要的
完整的 URI 访问权限,请确保在将路径传递给VaultTemplate.
| 引用 VaultTemplate实例
是通过其接口VaultOperations. | 
虽然有很多方便的方法VaultTemplate轻松帮助您
如果您需要直接访问 Vault API 才能访问,请执行常见任务
功能未由VaultTemplate您可以使用以下选项之一
多个执行回调方法来访问底层 API。执行回调
将为您提供对RestOperations对象。
有关更多信息,请参阅执行回调部分。
现在让我们看一个示例,了解如何在 Spring 容器的上下文中使用 Vault。
注册和配置 Spring Vault Bean
使用 Spring Vault 不需要 Spring Context。但是,实例VaultTemplate和SessionManager在托管上下文中注册将参与
在 Spring IoC 容器提供的生命周期事件中。这对于在
应用程序关闭。您还可以从重复使用相同的VaultTemplate实例。
Spring Vault 带有一个支持配置类,提供 bean 定义
在 Spring 上下文中使用。应用程序配置
类通常从AbstractVaultConfiguration并且必须
提供特定于环境的其他详细信息。
扩展自AbstractVaultConfiguration需要实现VaultEndpoint vaultEndpoint()和ClientAuthentication clientAuthentication()方法。
@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 | 创建一个新的 VaultEndpoint默认指向https://localhost:8200. | 
| 2 | 此示例使用 TokenAuthentication快速入门。
有关支持的身份验证方法的详细信息,请参阅 [vault.core.authentication]。 | 
@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 | 依赖项 ClientAuthentication方法可以从AbstractVaultConfiguration或由您的配置提供。 | 
| 在某些情况下,创建自定义配置类可能会很麻烦。
看看 EnvironmentVaultConfiguration允许使用
来自现有属性源的属性和 Spring 的Environment.阅读更多
在用EnvironmentVaultConfiguration. | 
会话管理
Spring Vault 需要一个ClientAuthentication以登录并访问 Vault。
有关身份验证的详细信息,请参阅 [vault.core.authentication]。
Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但
必须在整个会话中重复使用。这方面由SessionManager实现。一个SessionManager决定它的频率
获取一个Tokens,关于撤销和续订。Spring Vault 带有两种实现:
- 
SimpleSessionManager:仅从提供的ClientAuthentication无需刷新和吊销
- 
LifecycleAwareSessionManager:这SessionManagerschedules Tokens renew,如果Tokens是可续订的,并在处置时撤销登录Tokens。 续订计划时使用AsyncTaskExecutor.LifecycleAwareSessionManager如果使用AbstractVaultConfiguration.
用EnvironmentVaultConfiguration
Spring Vault 包括EnvironmentVaultConfiguration从 Spring 的Environment和一组预定义的
属性键。EnvironmentVaultConfiguration支持经常应用的配置。其他配置通过派生自最合适的配置类来支持。
包括EnvironmentVaultConfiguration跟@Import(EnvironmentVaultConfiguration.class)到现有
基于 Java 的配置类,并通过任何 Spring 的PropertySources.
@PropertySource("vault.properties")
@Import(EnvironmentVaultConfiguration.class)
public class MyConfiguration{
}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-type(可选,通常jks,还支持pem)
- 
信任库资源: vault.ssl.trust-store(可选)
- 
信任库密码: vault.ssl.trust-store-password(可选)
- 
信任库类型: vault.ssl.trust-store-type(可选,通常jks,还支持pem)
- 
启用的 SSL/TLS 协议: vault.ssl.enabled-protocols(从 2.3.2 开始,可选,协议用逗号分隔)
- 
启用的 SSL/TLS 密码套件: vault.ssl.enabled-cipher-suites(从 2.3.2 开始,可选,密码套件用逗号分隔)
 
- 
- 
认证方式: vault.authentication(默认为TOKEN,支持的身份验证方法有:TOKEN,APPROLE,AWS_EC2,AWS_IAM,AZURE,CERT,CUBBYHOLE,KUBERNETES)
特定于身份验证的属性键
- 
金库Tokens: vault.token
- 
AppRole 路径: vault.app-role.app-role-path(默认为approle)
- 
RoleId: vault.app-role.role-id
- 
SecretId: vault.app-role.secret-id(可选)
- 
AWS EC2 路径: vault.aws-ec2.aws-ec2-path(默认为aws-ec2)
- 
角色: vault.aws-ec2.role
- 
RoleId: vault.aws-ec2.role-id(deprecated: 使用vault.aws-ec2.role相反)
- 
身份证明文件网址: vault.aws-ec2.identity-document(默认为169.254.169.254/latest/dynamic/instance-identity/pkcs7)
- 
角色: vault.aws-iam.role
- 
Azure MSI 路径: vault.azure-msi.azure-path(默认为azure)
- 
角色: vault.azure-msi.role
- 
元数据服务 URL: vault.azure-msi.metadata-service(默认为169.254.169.254/metadata/instance?api-version=2017-08-01)
- 
身份Tokens服务 URL: vault.azure-msi.identity-token-service(默认为169.254.169.254/metadata/identity/oauth2/token?resource=https://vault.hashicorp.com&api-version=2018-02-01)
没有配置选项。
- 
初始金库Tokens: vault.token
- 
Kubernetes 路径: vault.kubernetes.kubernetes-path(默认为kubernetes)
- 
角色: vault.kubernetes.role
- 
服务帐户Tokens文件的路径: vault.kubernetes.service-account-token-file(默认为/var/run/secrets/kubernetes.io/serviceaccount/token)
执行回调
所有 Spring 模板类的一个共同设计特征是所有功能都路由到模板执行回调方法之一。
这有助于确保执行异常和可能需要的任何资源管理的一致性。
虽然 JDBC 和 JMS 对此的需求比 Vault 大得多,但它仍然提供了一个访问和日志记录的位置。
因此,使用执行回调是访问 Vault API 的首选方式
执行我们未作为方法公开的不常见作VaultTemplate.
下面是执行回调方法的列表。
- 
<T> TdoWithVault(RestOperationsCallback<T> callback)执行给定的RestOperationsCallback,允许使用RestOperations无需会话。
- 
<T> TdoWith会话(RestOperationsCallback<T> callback)执行给定的RestOperationsCallback,允许在经过身份验证的会话中与 Vault 进行交互。
下面是一个使用ClientCallback初始化 Vault:
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();
    }
});