此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Vault 3.1.2! |
VaultTemplate 简介
类 VaultTemplate
位于软件包
是 Spring 的 Vault 支持的中心类,它提供了丰富的功能集
与 Vault 交互。该模板提供了方便的读取、写入和
删除 Vault 中的数据,并提供域对象与 Vault 数据之间的映射。org.springframework.vault.core
配置后,VaultTemplate 是线程安全的,并且可以在
多个实例。 |
Vault 文档和域类之间的映射是通过委托 来完成的。Spring Web 支持提供了映射基础结构。RestTemplate
VaultTemplate
类实现接口 VaultOperations
。
VaultOperations
上的方法尽可能以 methods 命名
在 Vault API 上提供,以使现有 Vault 开发人员熟悉 API
他们习惯了 API 和 CLI。例如,您将找到诸如
“write”、“delete”、“read” 和 “revoke”。
设计目标是尽可能轻松地在
使用 Vault API 和 .两者之间的主要区别
这两个 API 是可以传递域对象而不是
JSON 键值对。VaultOperations
VaultOperations
引用 VaultTemplate 实例上的操作的首选方式
通过其接口 VaultOperations 进行。 |
虽然有许多方便的方法可以轻松帮助您
如果您需要直接访问 Vault API 以访问
功能未明确公开的 你可以使用
多个 execute 回调方法以访问底层 API。执行回调
将为您提供对对象的引用。
有关更多信息,请参阅 执行回调 部分。VaultTemplate
VaultTemplate
RestOperations
现在让我们看看如何在 Spring 容器的上下文中使用 Vault 的示例。
注册和配置 Spring Vault bean
使用 Spring Vault 不需要 Spring Context。但是,在托管上下文中注册的 和 SessionManager
的实例将参与其中
在 Spring IoC 容器提供的生命周期事件中。这对于在以下情况下处理活动的 Vault 会话非常有用
应用程序关闭。您还可以在应用程序中重复使用同一实例。VaultTemplate
VaultTemplate
Spring Vault 附带了一个支持 bean 定义的配置类
在 Spring 上下文中使用。应用程序配置
类通常从 AbstractVaultConfiguration
扩展而来,并且需要
提供特定于环境的其他详细信息。
从 AbstractVaultConfiguration
扩展需要 implement 和 methods。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 | 创建一个 默认指向 .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 |
在某些情况下,创建自定义配置类可能会很麻烦。
查看允许使用
来自现有属性源的属性和 Spring 的 .阅读更多
在使用 EnvironmentVaultConfiguration 中。Environment |
会话管理
Spring Vault 需要 登录和访问 Vault。
有关身份验证的详细信息,请参阅 [vault.core.authentication]。
Vault 登录不应在每次经过身份验证的 Vault 交互时进行,但
必须在整个会话中重复使用。这方面由 implementation 处理。A 决定它的频率
获取 Token,关于 Revocation 和 Renewal。Spring Vault 带有两个实现:ClientAuthentication
SessionManager
SessionManager
-
SimpleSessionManager
:仅从提供的 中获取令牌,无需刷新和吊销ClientAuthentication
-
LifecycleAwareSessionManager
:此调度令牌 如果令牌可续订,则续订,并在处置时撤销登录令牌。 续订计划使用 . 如果使用 .SessionManager
AsyncTaskExecutor
LifecycleAwareSessionManager
AbstractVaultConfiguration
用EnvironmentVaultConfiguration
Spring Vault 包括 EnvironmentVaultConfiguration
从 Spring 和 Spring 的一组预定义的 Vault 客户端配置
属性键。EnvironmentVaultConfiguration
支持频繁应用的配置。通过从最合适的配置类派生来支持其他配置。
将 EnvironmentVaultConfiguration
与现有
基于 Java 的配置类,并通过 Spring 的任何 s.Environment
@Import(EnvironmentVaultConfiguration.class)
PropertySource
@PropertySource("vault.properties")
@Import(EnvironmentVaultConfiguration.class)
public class MyConfiguration{
}
vault.uri=https://localhost:8200
vault.token=00000000-0000-0000-0000-000000000000
属性键
-
Vault 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 协议:(自 2.3.2 起,可选,协议以逗号分隔)
vault.ssl.enabled-protocols
-
已启用 SSL/TLS 密码套件:(自 2.3.2 起,可选,密码套件以逗号分隔)
vault.ssl.enabled-cipher-suites
-
-
身份验证方法:(默认为 ,支持的身份验证方法包括:、、
vault.authentication
TOKEN
TOKEN
APPID
APPROLE
AWS_EC2
AWS_IAM
AZURE
CERT
CUBBYHOLE
KUBERNETES
)
特定于身份验证的属性键
-
Vault 代币:
vault.token
-
AppId 路径:(默认为
vault.app-id.app-id-path
app-id
) -
AppId 中:
vault.app-id.app-id
-
UserId: . 并使用相应的用户 ID 机制。 任何其他值都与 一起使用。
vault.app-id.user-id
MAC_ADDRESS
IP_ADDRESS
MacAddressUserId
IpAddressUserId
StaticUserId
-
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
vault.aws-ec2.role
-
身份证明文件 URL:(默认为
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
) -
Identity TokenService 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
)
无配置选项。
-
初始 Vault Token:
vault.token
-
Kubernetes path:(默认为
vault.kubernetes.kubernetes-path
kubernetes
) -
角色:
vault.kubernetes.role
-
服务帐户令牌文件的路径:(默认为
vault.kubernetes.service-account-token-file
/var/run/secrets/kubernetes.io/serviceaccount/token
)
执行回调
所有 Spring 模板类的一个共同设计特征是所有功能都路由到模板执行回调方法之一。
这有助于确保异常和可能需要的任何资源管理的执行一致性。
虽然在 JDBC 和 JMS 的情况下,这比在 Vault 中的需求要大得多,但它仍然提供了一个访问和日志记录的单一位置。
因此,使用 execute 回调是访问 Vault API 的首选方式
来执行我们尚未在 VaultTemplate
上作为方法公开的不常见操作。
以下是 execute 回调方法的列表。
-
<T> T
doWithVault 执行给定的 ,允许使用 与 Vault 交互,而无需会话。(RestOperationsCallback<T> callback)
RestOperationsCallback
RestOperations
-
<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();
}
});