Spring Vault 项目将核心 Spring 概念应用于使用 HashiCorpVault 的解决方案的开发。我们提供了一个“模板”作为存储和查询文档的高级抽象。你将注意到与 Spring 框架中的 REST 支持的相似之处。
这份文件是 Spring Vault 的参考指南。它解释了 Vault 的概念、语义和语法。
参考文档的这一部分解释了 Spring Vault 提供的核心功能。
[保险库支持](#vault.core)介绍了 Vault 模块功能集。
## 1.文件结构
这一部分提供了 Spring 和 Vault 的基本介绍。它包含有关后续开发和如何获得支持的详细信息。
文档的其余部分引用了 Spring Vault 特性,并假定用户熟悉[HashiCorp 保险库](https://www.vaultproject.io)以及 Spring 概念。
## 2.知道 Spring
Spring Vault 使用 Spring Framework 的[core](https://docs.spring.io/spring/docs/5.3.4/spring-framework-reference/core.html)功能,例如[IoC](https://docs.spring.io/spring/docs/5.3.4/spring-framework-reference//core.html)容器。虽然了解 Spring API 并不重要,但了解它们背后的概念是重要的。至少,对于你选择使用的任何 IOC 容器,IOC 背后的思想应该是熟悉的。
Vault 支持的核心功能可以直接使用,而不需要调用 Spring 容器的 IoC 服务。这很像`RestTemplate`,它可以在没有 Spring 容器的任何其他服务的情况下“独立”使用。为了利用 Spring Vault 文档的所有特性,例如会话支持,你将需要使用 Spring 配置库的某些部分。
要了解有关 Spring 的更多信息,你可以参考详细解释 Spring 框架的全面(有时是解除武装)文档。有很多关于这个问题的文章、博客条目和书籍--看看 Spring 框架[home page ](https://spring.io/docs),了解更多信息。
## 3.知道保险库
安全性和处理秘密是每个处理数据库、用户凭据或 API 密钥的开发人员关心的问题。Vault 通过提供与访问控制、撤销、密钥滚动和审计相结合的安全存储来介入。简而言之:Vault 是一种安全访问和存储秘密的服务。秘密是你想要严格控制访问权限的任何东西,例如 API 密钥、密码、证书等等。
学习一个新的框架并不总是直截了当的。在这一部分中,我们试图提供一种我们认为易于遵循的指南,用于从 Spring Vault 模块开始。然而,如果你遇到问题或你只是在寻求建议,请使用以下链接之一:
### 5.1.支持
有几个可用的支持选项:
#### 5.1.1.社区论坛
在[StackOverflow](https://stackoverflow.com/questions/tagged/spring-vault)上发布有关 Spring Vault 的问题,以共享信息并相互帮助。请注意,需要注册**只有**才能发布。
#### 5.1.2.专业支持
Spring Vault 和 Spring 背后的公司[Pivotal Software,Inc.](https://pivotal.io/)提供专业的、源代码支持,并保证响应时间。
### 5.2.后续发展
有关 Spring Vault 源代码库、夜间构建和快照工件的信息,请参见[Spring Vault homepage](https://projects.spring.io/spring-vault/)。通过在[StackOverflow](https://stackoverflow.com/questions/tagged/spring-vault)上通过社区与开发人员进行交互,你可以帮助使 Spring Vault 最好地满足 Spring 社区的需求。如果你遇到错误或希望提出改进建议,请在 Spring vault 问题[tracker](https://github.com/spring-projects/spring-vault/issues)上创建一个票证。要了解 Spring 生态系统中的最新消息和公告,请订阅 Spring 社区[Portal](https://spring.io)。最后,你可以关注 Spring [blog ](https://spring.io/blog)或 Twitter 上的项目团队([SpringCentral](https://twitter.com/springcentral))。
* 可以使用`org.springframework.vault.client.VaultEndpoint`对象和`ClientAuthentication`实例化 Spring Vault 的中心类[`VaultTemplate`](#vault.core.template)。你不需要旋转 Spring 上下文来使用 Spring vault。
Vault 文档和域类之间的映射是通过委托给`RestTemplate`来完成的。 Spring Web 支持提供了映射基础设施。
`VaultTemplate`类实现了接口`VaultOperations`。在尽可能多的情况下,`VaultOperations`上的方法是以 Vault API 上可用的方法命名的,以使熟悉 API 和 CLI 的现有 Vault 开发人员熟悉该 API。例如,你将找到诸如“write”、“delete”、“read”和“revoke”等方法。设计目标是使 Vault API 的使用和`VaultOperations`之间的转换变得尽可能容易。这两个 API 之间的一个主要区别是,`VaultOperations`可以传递域对象,而不是 JSON 键-值对。
虽然在`VaultTemplate`上有许多方便的方法可以帮助你轻松地执行常见任务,如果你需要直接访问 Vault API 以访问`VaultTemplate`未显式暴露的功能,则可以使用几种执行回调方法中的一种来访问底层 API。Execute 回调将为你提供对`RestOperations`对象的引用。有关更多信息,请参见[执行回调](#vault.core.executioncallback)一节。
现在,让我们来看看如何在 Spring 容器的上下文中使用 Vault 的示例。
### 9.1.注册和配置 Spring Vault bean
使用 Spring Vault 不需要 Spring 上下文。但是,在托管上下文中注册的`VaultTemplate`和`SessionManager`实例将参与由 Spring IOC 容器提供的[生命周期事件](https://docs.spring.io/spring/docs/5.3.4/spring-framework-reference/core.html#beans-factory-nature)。这对于在应用程序关闭时处理活动的 Vault 会话非常有用。你还可以在应用程序中重用相同的`VaultTemplate`实例。
Spring Vault 附带了一个支持配置类,该配置类提供了 Bean 用于在 Spring 上下文中使用的定义。应用程序配置类通常从`AbstractVaultConfiguration`扩展,并且需要提供环境特定的附加细节。
| |在某些情况下,创建自定义配置类可能很麻烦。<br/>看看`EnvironmentVaultConfiguration`,它允许使用现有属性源的<br/>属性和 Spring 的`Environment`进行配置。在[using`EnvironmentVaultConfiguration`](#vault.core.environment-vault-configuration)中阅读更多<br/>。|
Spring Vault 需要`ClientAuthentication`才能登录和访问 Vault。有关身份验证的详细信息,请参见[认证方法](#vault.core.authentication)。Vault 登录不应该发生在每个经过身份验证的 Vault 交互上,而是必须在整个会话中重用。该方面由`SessionManager`实现来处理。a`SessionManager`决定它获得令牌的频率,关于撤销和更新。 Spring Vault 有两种实现方式:
Spring Vault 包括从 Spring 的`Environment`中配置 Vault 客户端的`EnvironmentVaultConfiguration`和一组预定义的属性键。`EnvironmentVaultConfiguration`支持经常应用的配置。从最合适的配置类派生支持其他配置。将`EnvironmentVaultConfiguration`与`@Import(EnvironmentVaultConfiguration.class)`一起包含到现有的基于 Java 的配置类中,并通过 Spring 的`PropertySource`s 中的任何一个提供配置属性。
`ReactiveVaultTemplate`类实现了接口`ReactiveVaultOperations`。在尽可能多的情况下,`ReactiveVaultOperations`上的方法是以 Vault API 上可用的方法命名的,以使熟悉 API 和 CLI 的现有 Vault 开发人员熟悉该 API。例如,你将找到诸如“write”、“delete”和“read”之类的方法。设计目标是使 Vault API 的使用和`ReactiveVaultOperations`之间的转换变得尽可能容易。这两个 API 之间的一个主要区别是,`ReactiveVaultOperations`可以传递域对象,而不是 JSON 键-值对。
使用 Spring vault 不需要 Spring 上下文。然而,在托管上下文中注册的`ReactiveVaultTemplate`和`VaultTokenSupplier`的实例将参与由 Spring IOC 容器提供的[生命周期事件](https://docs.spring.io/spring/docs/5.3.4/spring-framework-reference/core.html#beans-factory-nature)。这对于在应用程序关闭时处理活动的 Vault 会话非常有用。你还受益于在应用程序中重用相同的`ReactiveVaultTemplate`实例。
Spring Vault 附带了一个支持配置类,该配置类提供了 Bean 用于在 Spring 上下文中使用的定义。应用程序配置类通常从`AbstractVaultConfiguration`扩展,并且需要提供环境特定的附加细节。
在上面的代码中,`VaultPropertySource`在搜索中被添加了最高优先级。如果它包含一个 foo` property, it will be detected and returned ahead of any `foo` property in any other `PropertySource`.`mutablePropertySources` 暴露了许多方法,这些方法允许对属性源集进行精确操作。
### 12.2.@VaultPropertySource
`@VaultPropertySource`注释提供了一种方便的声明性机制,用于将`PropertySource`添加到 Spring 的`Environment`中,以便与`@Configuration`类一起使用。
使用`VaultTemplate`和映射到 Java 类的响应可以实现基本的数据操作,如读、写和删除。 Spring Vault 存储库在 Vault 之上应用了数据存储库的概念。Vault 存储库公开了基本的增删改查功能,并支持使用限制 ID 属性、分页和排序的谓词进行查询派生。
| |在[Spring Data Commons reference documentation](https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories)中阅读有关 Spring 数据存储库的更多信息。参考文档将向你介绍 Spring 数据存储库。|
Spring 的[PropertySource 抽象](https://docs.spring.io/spring/docs/5.3.4/spring-framework-reference/core.html#beans-property-source-abstraction)是将配置保持在应用程序代码之外的一种自然适合。你可以使用系统属性、环境变量或属性文件来存储登录凭据。每种方法都有自己的特性。请记住,可以通过适当的 OS 访问级别来内省命令行和环境属性。
例 26.将`vault.token`外部化到属性文件
```
@PropertySource("configuration.properties")
@Configuration
public class Config extends AbstractVaultConfiguration {
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication(getEnvironment().getProperty("vault.token"));
通常,令牌身份验证用于在外部创建和更新令牌的场景中(例如[HashiCorpVault Service Broker](https://github.com/hashicorp/vault-service-broker))。根据实际的设置,你可能希望也可能不希望令牌更新和撤销。有关 TTL 和令牌撤销的详细信息,请参见[`LifecycleAwareSessionManager`](#vault.authentication.会话)。
```
@Configuration
class AppConfig extends AbstractVaultConfiguration {
// …
@Override
public ClientAuthentication clientAuthentication() {
GCPGCE(Google 计算引擎)身份验证为服务帐户创建 JSON Web 令牌形式的签名。使用[实例标识](https://cloud.google.com/compute/docs/instances/verifying-instance-identity)从 GCE 元数据服务获得计算引擎实例的 JWT。该 API 创建了一个 JSON Web 令牌,该令牌可用于确认实例标识。
GcpIamAuthentication authentication = new GcpIamAuthentication(options,
restOperations());
}
// …
}
```
`GcpIamAuthenticationOptions`需要 Google Cloud Java SDK 依赖项(`com.google.apis:google-api-services-iam`和`com.google.auth:google-auth-library-oauth2-http`),因为身份验证实现使用 Google API 进行凭据和 JWT 签名。