Spring Vault的Vault 的概念和語(yǔ)義以及語(yǔ)法、核心功能

2022-12-20 14:04:50 來(lái)源:51CTO博客

Spring Vault項(xiàng)目將Spring的核心概念應(yīng)用于使用HashiCorp Vault開(kāi)發(fā)解決方案。我們提供了一個(gè)“模板”作為存儲(chǔ)和查詢(xún)文檔的高級(jí)抽象。你會(huì)注意到與 Spring 框架中的 REST 支持有相似之處。

本文檔是 Spring Vault 的參考指南。它解釋了 Vault 的概念和語(yǔ)義以及語(yǔ)法。


(相關(guān)資料圖)

參考文檔的這一部分解釋了 Spring Vault 提供的核心功能。

庫(kù)支持引入了庫(kù)模塊功能集。

1. 文檔結(jié)構(gòu)

本節(jié)提供對(duì) Spring 和 Vault 的基本介紹。 它包含有關(guān)后續(xù)開(kāi)發(fā)以及如何獲得支持的詳細(xì)信息。

文檔的其余部分引用了 Spring Vault 功能并假設(shè) 用戶(hù)熟悉HashiCorp Vault以及Spring概念。

2. 認(rèn)識(shí)春天

Spring Vault使用Spring框架的核心功能,例如IoC容器。雖然了解Spring API并不重要,但了解它們背后的概念才是重要的。至少,對(duì)于您選擇使用的任何 IoC 容器,都應(yīng)該熟悉 IoC 背后的理念。

Vault 支持的核心功能可以直接使用,無(wú)需調(diào)用 Spring 容器的 IoC 服務(wù)。這很像可以在沒(méi)有 Spring 容器的任何其他服務(wù)的情況下“獨(dú)立”使用。要利用 Spring Vault 文檔的所有功能,例如會(huì)話(huà)支持,您需要使用 Spring 配置庫(kù)的某些部分。??RestTemplate??

要了解有關(guān) Spring 的更多信息,您可以參考詳細(xì)解釋 Spring 框架的全面(有時(shí)是撤防)文檔。有很多關(guān)于這個(gè)問(wèn)題的文章,博客條目和書(shū)籍 - 請(qǐng)查看Spring框架主頁(yè)以獲取更多信息。

3. 了解保險(xiǎn)庫(kù)

安全性和使用機(jī)密是每個(gè)使用數(shù)據(jù)庫(kù)、用戶(hù)憑據(jù)或 API 密鑰的開(kāi)發(fā)人員關(guān)注的問(wèn)題。Vault 通過(guò)提供與訪(fǎng)問(wèn)控制、吊銷(xiāo)、密鑰滾動(dòng)和審核相結(jié)合的安全存儲(chǔ)來(lái)介入。簡(jiǎn)而言之:保險(xiǎn)柜是一種用于安全訪(fǎng)問(wèn)和存儲(chǔ)機(jī)密的服務(wù)。機(jī)密是您想要嚴(yán)格控制訪(fǎng)問(wèn)的任何內(nèi)容,例如 API 密鑰、密碼、證書(shū)等。

了解Vault的起點(diǎn)是www.vaultproject.io。以下是有用資源的列表:

該手冊(cè)介紹了 Vault,并包含入門(mén)指南、參考文檔和教程的鏈接。結(jié)合在線(xiàn)教程,在線(xiàn) shell 提供了一種與 Vault 實(shí)例交互的便捷方式。橋獅金庫(kù)介紹橋獅公司保險(xiǎn)庫(kù)文檔

Spring Vault 為訪(fǎng)問(wèn)、存儲(chǔ)和撤銷(xiāo)密鑰提供客戶(hù)端支持。 有了橋牌公司的金庫(kù),你有一個(gè)中心的地方 管理所有環(huán)境中應(yīng)用程序的外部機(jī)密數(shù)據(jù)。 保險(xiǎn)柜可以管理靜態(tài)和動(dòng)態(tài)機(jī)密,例如應(yīng)用程序數(shù)據(jù), 遠(yuǎn)程應(yīng)用程序/資源的用戶(hù)名/密碼并提供憑據(jù) 用于外部服務(wù),如MySQL,PostgreSQL,Apache Cassandra,Consul,AWS等。

4. 要求

Spring Vault 2.x 二進(jìn)制文件需要 JDK 8.0 及以上版本,以及Spring Framework5.2.12.RELEASE 及更高版本。

在保險(xiǎn)庫(kù)方面,保險(xiǎn)柜至少為0.6。

5. 其他幫助資源

學(xué)習(xí)一個(gè)新框架并不總是直截了當(dāng)?shù)?。在本?jié)中,我們嘗試提供我們認(rèn)為易于遵循的指南,以便從Spring Vault模塊開(kāi)始。但是,如果您遇到問(wèn)題或只是在尋找建議,請(qǐng)隨時(shí)使用以下鏈接之一:

5.1. 支持

有幾個(gè)支持選項(xiàng)可用:

5.1.1. 社區(qū)論壇

在Stackoverflow上發(fā)布有關(guān) Spring Vault 的問(wèn)題,以共享信息并互相幫助。請(qǐng)注意,只有發(fā)布時(shí)才需要注冊(cè)。

5.1.2. 專(zhuān)業(yè)支持

專(zhuān)業(yè)的,從源頭支持,保證響應(yīng)時(shí)間,可從Spring Vault和Spring背后的公司Pivotal Sofware,Inc.獲得。

5.2. 后續(xù)開(kāi)發(fā)

有關(guān) Spring Vault 源代碼存儲(chǔ)庫(kù)、夜間構(gòu)建和快照工件的信息,請(qǐng)參閱Spring Vault 主頁(yè)?。您可以通過(guò)Stackoverflow?上的社區(qū)與開(kāi)發(fā)人員互動(dòng),幫助 Spring Vault 最好地滿(mǎn)足 Spring 社區(qū)的需求。如果您遇到錯(cuò)誤或想提出改進(jìn)建議,請(qǐng)?jiān)赟pring Vault問(wèn)題跟蹤器?上創(chuàng)建票證。要及時(shí)了解 Spring 生態(tài)系統(tǒng)中的最新消息和公告,請(qǐng)訂閱 Spring 社區(qū)門(mén)戶(hù)?。最后,您可以在Twitter(SpringCentral?)上關(guān)注Spring博客或項(xiàng)目團(tuán)隊(duì)。

6. 新的和值得注意的

6.1. 春季保險(xiǎn)庫(kù) 2.2 中的新功能

通過(guò) 支持鍵值 v2(版本控制后端)機(jī)密。@VaultPropertySource中的 SpEL 支持 。@Secret添加對(duì) Jetty 作為反應(yīng)式 HttpClient 的支持。??LifecycleAwareSessionManager??并發(fā)出現(xiàn)在的 s。ReactiveLifecycleAwareSessionManagerAuthenticationEventPCF 身份驗(yàn)證。棄用 。請(qǐng)按照HashiCorp Vault的建議使用。AppIdAuthenticationAppRoleAuthentication??CubbyholeAuthentication??和包裝現(xiàn)在默認(rèn)使用端點(diǎn)。AppRoleAuthenticationsys/wrapping/unwrapKotlin 協(xié)程對(duì) 的支持。ReactiveVaultOperations

6.2. 春季保險(xiǎn)庫(kù) 2.1 中的新功能

GCP Compute、GCP IAM和Azure身份驗(yàn)證。模板 API 支持版本化和不受版本控制的鍵/值后端以及保管庫(kù)包裝操作。在反應(yīng)式 AppRole 身份驗(yàn)證中支持完全拉取模式。改進(jìn)了保管庫(kù)登錄失敗的異常層次結(jié)構(gòu)。

6.3. 春季保險(xiǎn)庫(kù) 2.0 中的新功能

用于組合身份驗(yàn)證流的身份驗(yàn)證步驟DSL。通過(guò) 反應(yīng)式保管庫(kù)客戶(hù)端。ReactiveVaultOperations基于Spring Data KeyValue的Vault存儲(chǔ)庫(kù)支持。傳輸批量加密和解密支持。存儲(chǔ)為 JSON 的策略的策略管理。支持CSR簽名、證書(shū)吊銷(xiāo)和CRL檢索。Kubernetes 身份驗(yàn)證。用于A(yíng)ppRole 身份驗(yàn)證的 RoleId/SecretId 解包。Spring 安全與基于傳輸后端和 .BytesKeyGeneratorBytesEncryptor

6.4. 春季保險(xiǎn)庫(kù) 1.1.0 中的新功能

AWS IAM 身份驗(yàn)證。配置傳輸密鑰的加密/解密版本。應(yīng)用角色身份驗(yàn)證的拉取模式。傳輸批量加密和解密支持?;?TTL 的通用機(jī)密輪換。

6.5. 春季保險(xiǎn)庫(kù) 1.0 中的新功能

初始保管庫(kù)支持。

參考文檔

7. 保險(xiǎn)庫(kù)支持

Vault 支持包含廣泛的功能,總結(jié)如下。

使用基于 Java 的 @Configuration 類(lèi)的 Spring 配置支持??VaultTemplate??幫助程序類(lèi),可提高工作效率,執(zhí)行常見(jiàn)性能 保險(xiǎn)庫(kù)操作。包括保險(xiǎn)柜響應(yīng)和 POJO 之間的集成對(duì)象映射。

對(duì)于大多數(shù)任務(wù),您會(huì)發(fā)現(xiàn)自己使用 豐富的通信功能。 是尋找的地方 訪(fǎng)問(wèn)功能,例如從保險(xiǎn)柜讀取數(shù)據(jù)或發(fā)出 管理命令。 還提供回調(diào)方法,以便您輕松 獲取低級(jí) API 工件,例如用于通信 直接與保險(xiǎn)柜。??VaultTemplate????VaultTemplate????VaultTemplate????RestTemplate??

7.1. 依賴(lài)關(guān)系

查找兼容版本的 Spring Vault 依賴(lài)項(xiàng)的最簡(jiǎn)單方法 是依靠我們隨兼容版本一起提供的Spring Vault BOM 定義。在 Maven 項(xiàng)目中,您將在 :??????pom.xml??

例 1.使用 Spring Vault BOM

            org.springframework.vault      spring-vault-dependencies      2.2.3.RELEASE      import      pom      

當(dāng)前版本為 。版本名稱(chēng)如下 模式:其中釋放可以是以下之一:??2.2.3.RELEASE????${version}-${release}??

??BUILD-SNAPSHOT??- 當(dāng)前快照??M1??等 - 里程碑M2??RC1??等 - 發(fā)布候選版本RC2??RELEASE??- 正式發(fā)布??SR1??等 - 服務(wù)發(fā)布SR2

例 2.聲明對(duì) Spring Vault 的依賴(lài)關(guān)系

            org.springframework.vault        spring-vault-core    

7.2. 彈簧框架

Spring Vault 的當(dāng)前版本需要 Spring Framework 5.2.12.發(fā)布或更好。這些模塊也可能使用較舊的錯(cuò)誤修復(fù) 該次要版本的版本。但是,使用最新版本 強(qiáng)烈建議在這一代內(nèi)。

8. 入門(mén)

Spring Vault 支持需要 Vault 0.6 或更高版本和 Java SE 6 或更高版本。 引導(dǎo)設(shè)置工作環(huán)境的一種簡(jiǎn)單方法是創(chuàng)建一個(gè)STS中基于彈簧的項(xiàng)目。

首先,您需要設(shè)置一個(gè)正在運(yùn)行的 Vault 服務(wù)器。 有關(guān)如何啟動(dòng)文件庫(kù)實(shí)例的說(shuō)明,請(qǐng)參閱文件庫(kù)。

要在 STS 中創(chuàng)建 Spring 項(xiàng)目,請(qǐng)轉(zhuǎn)到“新建文件→→ 彈簧模板項(xiàng)目 → 簡(jiǎn)單的彈簧實(shí)用程序項(xiàng)目→ 出現(xiàn)提示時(shí)按是。然后輸入項(xiàng)目和包名稱(chēng),例如 .??org.spring.vault.example??

然后將以下內(nèi)容添加到依賴(lài)項(xiàng)部分。??pom.xml??

例 3.添加 Spring Vault 依賴(lài)項(xiàng)

        org.springframework.vault    spring-vault-core    2.2.3.RELEASE  

如果您使用的是里程碑或候選版本,則還需要添加 Spring 的位置 您的 maven 的里程碑存儲(chǔ)庫(kù),它與您的元素處于同一級(jí)別。??pom.xml??????

      spring-milestone    Spring Maven MILESTONE Repository    https://repo.spring.io/libs-milestone  

存儲(chǔ)庫(kù)也可以在此處瀏覽。

如果您使用的是快照,則還需要添加彈簧的位置 快照存儲(chǔ)庫(kù)到您的 maven,該存儲(chǔ)庫(kù)與您的元素處于同一級(jí)別。??pom.xml??????

      spring-snapshot    Spring Maven SNAPSHOT Repository    https://repo.spring.io/libs-snapshot  

存儲(chǔ)庫(kù)也可以在此處瀏覽。

創(chuàng)建一個(gè)簡(jiǎn)單的類(lèi)來(lái)持久保存:??Secrets??

例 4.映射的數(shù)據(jù)對(duì)象

package org.spring.vault.example;public class Secrets {    String username;    String password;    public String getUsername() {        return username;    }    public String getPassword() {        return password;    }}

和要運(yùn)行的主要應(yīng)用程序

例 5.使用 Spring Vault 的示例應(yīng)用程序

package org.springframework.vault.example;import org.springframework.vault.authentication.TokenAuthentication;import org.springframework.vault.client.VaultEndpoint;import org.springframework.vault.core.VaultTemplate;import org.springframework.vault.support.VaultResponseSupport;public class VaultApp {    public static void main(String[] args) {        VaultTemplate vaultTemplate = new VaultTemplate(new VaultEndpoint(),                new TokenAuthentication("00000000-0000-0000-0000-000000000000"));        Secrets secrets = new Secrets();        secrets.username = "hello";        secrets.password = "world";        vaultTemplate.write("secret/myapp", secrets);        VaultResponseSupport response = vaultTemplate.read("secret/myapp", Secrets.class);        System.out.println(response.getData().getUsername());        vaultTemplate.delete("secret/myapp");    }}

即使在這個(gè)簡(jiǎn)單的例子中,也很少有需要注意的事情

您可以使用對(duì)象和 .您不需要啟動(dòng) Spring 上下文即可使用 Spring Vault。org.springframework.vault.client.VaultEndpointClientAuthentication保管庫(kù)應(yīng)配置根令牌 以運(yùn)行此應(yīng)用程序。00000000-0000-0000-0000-000000000000映射器針對(duì)標(biāo)準(zhǔn) POJO 對(duì)象工作,無(wú)需任何 其他元數(shù)據(jù)(但您可以選擇提供該信息)。映射約定可以使用字段訪(fǎng)問(wèn)。請(qǐng)注意,該類(lèi)只有 getter。Secrets如果構(gòu)造函數(shù)參數(shù)名稱(chēng)與存儲(chǔ)文檔的字段名稱(chēng)匹配, 它們將用于實(shí)例化對(duì)象。

9. 保險(xiǎn)庫(kù)模板簡(jiǎn)介

類(lèi) ,位于包中, 是 Spring 的 Vault 支持的核心類(lèi),提供豐富的功能集 與保險(xiǎn)柜互動(dòng)。該模板提供了讀取、寫(xiě)入和 刪除保險(xiǎn)柜中的數(shù)據(jù),并提供網(wǎng)域?qū)ο笈c保險(xiǎn)柜數(shù)據(jù)之間的映射。??VaultTemplate????org.springframework.vault.core??

配置后,是線(xiàn)程安全的,并且可以在 多個(gè)實(shí)例。??VaultTemplate??

Vault 文檔和域類(lèi)之間的映射是通過(guò)委派給 來(lái)完成的。Spring Web 支持提供了映射基礎(chǔ)結(jié)構(gòu)。??RestTemplate??

該類(lèi)實(shí)現(xiàn)接口 。 盡可能以方法命名 在保險(xiǎn)柜 API 上可用,使現(xiàn)有保險(xiǎn)柜開(kāi)發(fā)者熟悉該 API 習(xí)慣了 API 和 CLI。例如,您會(huì)發(fā)現(xiàn)諸如 “寫(xiě)入”、“刪除”、“讀取”和“撤銷(xiāo)”。 設(shè)計(jì)目標(biāo)是盡可能輕松地在 保管庫(kù) API 的使用和 .兩者之間的主要區(qū)別 這兩個(gè) API 是可以傳遞域?qū)ο蠖皇?JSON 鍵值對(duì)。??VaultTemplate????VaultOperations????VaultOperations????VaultOperations????VaultOperations??

引用實(shí)例上操作的首選方法 是通過(guò)它的界面.??VaultTemplate????VaultOperations??

雖然有許多方便的方法可以幫助您輕松 如果您需要直接訪(fǎng)問(wèn)保管庫(kù) API 才能訪(fǎng)問(wèn),請(qǐng)執(zhí)行常見(jiàn)任務(wù) 未顯式公開(kāi)的功能 您可以使用以下之一 幾個(gè)執(zhí)行回調(diào)方法來(lái)訪(fǎng)問(wèn)底層 API。執(zhí)行回調(diào) 將為您提供對(duì)對(duì)象的引用。 有關(guān)詳細(xì)信息,請(qǐng)參閱執(zhí)行回調(diào)部分。??VaultTemplate????VaultTemplate????RestOperations??

現(xiàn)在讓我們看一個(gè)如何在 Spring 容器上下文中使用 Vault 的示例。

9.1. 注冊(cè)和配置 Spring Vault bean

使用 Spring Vault 不需要 Spring 上下文。但是,在托管上下文中注冊(cè)的實(shí)例將參與 在 Spring IoC 容器提供的生命周期事件中。這對(duì)于在以下情況下處置活動(dòng)的保管庫(kù)會(huì)話(huà)非常有用 應(yīng)用程序關(guān)閉。您還可以從在整個(gè)應(yīng)用程序中重用同一實(shí)例中受益。??VaultTemplate????SessionManager????VaultTemplate??

Spring Vault 附帶了一個(gè)支持配置類(lèi),該類(lèi)提供 Bean 定義 用于 Spring 上下文。應(yīng)用程序配置 類(lèi)通常從 并且需要 提供特定于環(huán)境的其他詳細(xì)信息。??AbstractVaultConfiguration??

從需求擴(kuò)展到實(shí)現(xiàn) " VaultEndpoint vaultEndpoint()" 和方法。??AbstractVaultConfiguration????ClientAuthentication clientAuthentication()??

例 6.使用基于 Java 的 Bean 元數(shù)據(jù)注冊(cè) Spring Vault 對(duì)象

@Configurationpublic class AppConfig extends AbstractVaultConfiguration {    /**     * Specify an endpoint for connecting to Vault.     */    @Override    public VaultEndpoint vaultEndpoint() {        return new VaultEndpoint();                                }    /**     * Configure a client authentication.     * Please consider a more secure authentication method     * for production use.     */    @Override    public ClientAuthentication clientAuthentication() {        return new TokenAuthentication("…");                       }}

創(chuàng)建一個(gè)缺省情況下指向 的新節(jié)點(diǎn)。??VaultEndpoint????https://localhost:8200??

此示例用于快速入門(mén)。

有關(guān)支持的身份驗(yàn)證方法的詳細(xì)信息,請(qǐng)參閱身份驗(yàn)證方法?。??TokenAuthentication??

例 7.注冊(cè)應(yīng)用注入屬性的 Spring Vault

@Configurationpublic 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);                              }    /**     * Configure a Client Certificate authentication.     * {@link RestOperations} can be obtained from {@link #restOperations()}.     */    @Override    public ClientAuthentication clientAuthentication() {        return new ClientCertificateAuthentication(restOperations());     }}

??VaultEndpoint???可以使用各種工廠(chǎng)方法(如 或 )進(jìn)行構(gòu)造。??from(URI uri)????VaultEndpoint.create(String host, int port)??

方法的依賴(lài)項(xiàng)可以從配置中獲取,也可以由配置提供。??ClientAuthentication????AbstractVaultConfiguration??

在某些情況下,創(chuàng)建自定義配置類(lèi)可能很麻煩。 看看允許使用 來(lái)自現(xiàn)有屬性源和 Spring 的屬性。閱讀更多 在使用環(huán)境保管庫(kù)配置中。??EnvironmentVaultConfiguration????Environment??

9.2. 會(huì)話(huà)管理

Spring Vault 需要登錄和訪(fǎng)問(wèn) Vault。 有關(guān)身份驗(yàn)證的詳細(xì)信息,請(qǐng)參閱身份驗(yàn)證方法。 保管庫(kù)登錄不應(yīng)發(fā)生在每個(gè)經(jīng)過(guò)身份驗(yàn)證的保管庫(kù)交互中,但應(yīng) 必須在整個(gè)會(huì)話(huà)中重復(fù)使用。這方面由實(shí)現(xiàn)處理。A 決定多久一次 獲取有關(guān)吊銷(xiāo)和續(xù)訂的令牌。Spring Vault 帶有兩個(gè)實(shí)現(xiàn):??ClientAuthentication????SessionManager????SessionManager??

??SimpleSessionManager??:僅從提供的令牌中獲取令牌,無(wú)需刷新和吊銷(xiāo)ClientAuthentication??LifecycleAwareSessionManager??:此計(jì)劃令牌 如果令牌可續(xù)訂,則續(xù)訂,并在處置時(shí)撤銷(xiāo)登錄令牌。 續(xù)訂計(jì)劃使用 . 如果使用 ,則默認(rèn)配置 。SessionManagerAsyncTaskExecutorLifecycleAwareSessionManagerAbstractVaultConfiguration

9.3. 使用??EnvironmentVaultConfiguration??

Spring Vault包括從Spring配置Vault客戶(hù)端和一組預(yù)定義的 屬性鍵。 支持頻繁應(yīng)用的配置。通過(guò)派生自最合適的配置類(lèi)來(lái)支持其他配置。包含到現(xiàn)有 基于 Java 的配置類(lèi),并通過(guò) Spring 的任何配置類(lèi)提供配置屬性。??EnvironmentVaultConfiguration????Environment????EnvironmentVaultConfiguration????EnvironmentVaultConfiguration????@Import(EnvironmentVaultConfiguration.class)????PropertySource??

例 8.將環(huán)境保險(xiǎn)庫(kù)配置與屬性文件結(jié)合使用

基于 Java 的配置類(lèi)

@PropertySource("vault.properties")@Import(EnvironmentVaultConfiguration.class)public class MyConfiguration{}

保管庫(kù)屬性

vault.uri=https://localhost:8200vault.token=00000000-0000-0000-0000-000000000000

屬性鍵

保管庫(kù) URI:vault.uriSSL 配置密鑰庫(kù)資源:(可選)vault.ssl.key-store密鑰庫(kù)密碼:(可選)vault.ssl.key-store-password信任庫(kù)資源:(可選)vault.ssl.trust-store信任庫(kù)密碼:(可選)vault.ssl.trust-store-password身份驗(yàn)證方法:(默認(rèn)為 ,支持的身份驗(yàn)證方法包括:、、、vault.authenticationTOKENTOKENAPPIDAPPROLEAWS_EC2AZURECERTCUBBYHOLEKUBERNETES)

特定于身份驗(yàn)證的屬性鍵

?令牌身份驗(yàn)證?

金庫(kù)令牌:vault.token

?應(yīng)用標(biāo)識(shí)身份驗(yàn)證?

AppId 路徑:(默認(rèn)為vault.app-id.app-id-pathapp-id)應(yīng)用標(biāo)識(shí):vault.app-id.app-id用戶(hù)標(biāo)識(shí):。 并使用各自的用戶(hù) ID 機(jī)制。 任何其他值都與 一起使用。vault.app-id.user-idMAC_ADDRESSIP_ADDRESSMacAddressUserIdIpAddressUserIdStaticUserId

?應(yīng)用角色身份驗(yàn)證?

應(yīng)用角色路徑:(默認(rèn)為vault.app-role.app-role-pathapprole)角色標(biāo)識(shí):vault.app-role.role-id秘密 ID:(可選)vault.app-role.secret-id

?AWS-EC2 身份驗(yàn)證?

AWS EC2 路徑:(默認(rèn)為vault.aws-ec2.aws-ec2-pathaws-ec2)角色:vault.aws-ec2.role角色 ID:(已棄用:改用)vault.aws-ec2.role-idvault.aws-ec2.role身份證件網(wǎng)址:(默認(rèn)為vault.aws-ec2.identity-documenthttp://169.254.169.254/latest/dynamic/instance-identity/pkcs7)

?Azure (MSI) 身份驗(yàn)證?

Azure MSI 路徑:(默認(rèn)為vault.azure-msi.azure-pathazure)角色:vault.azure-msi.role元數(shù)據(jù)服務(wù) URL:(默認(rèn)為vault.azure-msi.metadata-servicehttp://169.254.169.254/metadata/instance?api-version=2017-08-01)身份令牌服務(wù) URL:(默認(rèn)為vault.azure-msi.identity-token-servicehttp://169.254.169.254/metadata/identity/oauth2/token?resource=https://vault.hashicorp.com&api-version=2018-02-01)

TLS 證書(shū)身份驗(yàn)證

沒(méi)有配置選項(xiàng)。

隔間孔認(rèn)證

初始保管庫(kù)令牌:vault.token

Kubernetes 身份驗(yàn)證

Kubernetes 路徑:(默認(rèn)為vault.kubernetes.kubernetes-pathkubernetes)角色:vault.kubernetes.role服務(wù)帳戶(hù)令牌文件的路徑:(默認(rèn)為vault.kubernetes.service-account-token-file/var/run/secrets/kubernetes.io/serviceaccount/token)

9.4. 執(zhí)行回調(diào)

所有 Spring 模板類(lèi)的一個(gè)共同設(shè)計(jì)特征是,所有功能都路由到其中一個(gè)模板執(zhí)行回調(diào)方法中。 這有助于確保異常和可能需要的任何資源管理執(zhí)行的一致性。 雖然在JDBC和JMS的情況下,這比Vault更需要,但它仍然為訪(fǎng)問(wèn)和日志記錄提供了一個(gè)單一的位置。 因此,使用執(zhí)行回調(diào)是訪(fǎng)問(wèn)保管庫(kù) API 的首選方式 執(zhí)行我們尚未在 上公開(kāi)為方法的不常見(jiàn)操作。??VaultTemplate??

下面是執(zhí)行回調(diào)方法的列表。

?? T??doWithVault執(zhí)行給定的,允許使用與 Vault 進(jìn)行交互,而無(wú)需會(huì)話(huà)。(RestOperationsCallback callback)RestOperationsCallbackRestOperations?? T??doWithSession執(zhí)行給定的 ,允許在經(jīng)過(guò)身份驗(yàn)證的會(huì)話(huà)中與 Vault 交互。(RestOperationsCallback callback)RestOperationsCallback

下面是一個(gè)使用 初始化 Vault 的示例:??ClientCallback??

vaultOperations.doWithVault(new RestOperationsCallback() {  @Override  public VaultInitializationResponse doWithRestOperations(RestOperations restOperations) {    ResponseEntity exchange = restOperations                       .exchange("/sys/init", HttpMethod.PUT,                                 new HttpEntity(request),                                 VaultInitializationResponse.class);    return exchange.getBody();    }});

10. 反應(yīng)式保險(xiǎn)庫(kù)模板簡(jiǎn)介

本節(jié)介紹有關(guān)使用 Spring Vault 的響應(yīng)式編程支持的基本信息。

10.1. 什么是響應(yīng)式編程?

簡(jiǎn)單來(lái)說(shuō),響應(yīng)式編程是關(guān)于非阻塞應(yīng)用程序,這些應(yīng)用程序是 異步和事件驅(qū)動(dòng),需要少量線(xiàn)程才能垂直擴(kuò)展 (即在 JVM 內(nèi))而不是水平(即通過(guò)集群)。

反應(yīng)應(yīng)用的一個(gè)關(guān)鍵方面是背壓的概念,這是一種機(jī)制 以確保生產(chǎn)者不會(huì)讓消費(fèi)者不知所措。例如,在反應(yīng)式管道中 當(dāng) HTTP 連接為 太慢 數(shù)據(jù)存儲(chǔ)庫(kù)也會(huì)變慢或完全停止,直到網(wǎng)絡(luò)容量釋放。

10.2. 反應(yīng)式保險(xiǎn)庫(kù)客戶(hù)端

Spring Vault 的反應(yīng)式客戶(hù)端支持建立在可組合的身份驗(yàn)證步驟和 Spring 通過(guò) Reactor Netty 或 Jetty 的功能之上,它們都具有完全非阻塞、事件驅(qū)動(dòng)的 HTTP 客戶(hù)端。??WebClient??

它公開(kāi)為對(duì) HTTP 請(qǐng)求進(jìn)行身份驗(yàn)證的供應(yīng)商 并作為主要入口點(diǎn)。的核心配置 和SSL在 各種客戶(hù)端實(shí)現(xiàn)。??VaultTokenSupplier????VaultToken????ReactiveVaultOperations????VaultEndpoint????ClientOptions??

類(lèi) ,位于包中, 是 Spring 反應(yīng)式 Vault 支持的核心類(lèi),提供豐富的功能集 與保險(xiǎn)柜互動(dòng)。該模板提供了讀取、寫(xiě)入和 刪除保險(xiǎn)柜中的數(shù)據(jù),并提供網(wǎng)域?qū)ο笈c保險(xiǎn)柜數(shù)據(jù)之間的映射。??ReactiveVaultTemplate????org.springframework.vault.core??

配置后,是線(xiàn)程安全的,并且可以在 多個(gè)實(shí)例。??ReactiveVaultTemplate??

Vault 文檔和域類(lèi)之間的映射是通過(guò)委派 to 及其編解碼器來(lái)完成的。??WebClient??

該類(lèi)實(shí)現(xiàn)接口 。 盡可能以方法命名 在保險(xiǎn)柜 API 上可用,使現(xiàn)有保險(xiǎn)柜開(kāi)發(fā)者熟悉該 API 習(xí)慣了 API 和 CLI。例如,您會(huì)發(fā)現(xiàn)諸如 “寫(xiě)入”、“刪除”和“讀取”。 設(shè)計(jì)目標(biāo)是盡可能輕松地在 保管庫(kù) API 的使用和 .兩者之間的主要區(qū)別 這兩個(gè) API 是可以傳遞域?qū)ο蠖皇?JSON 鍵值對(duì)。??ReactiveVaultTemplate????ReactiveVaultOperations????ReactiveVaultOperations????ReactiveVaultOperations????ReactiveVaultOperations??

引用實(shí)例上操作的首選方法 是通過(guò)它的界面.??ReactiveVaultTemplate????ReactiveVaultOperations??

未顯式公開(kāi)的功能 您可以使用以下之一 幾個(gè)執(zhí)行回調(diào)方法來(lái)訪(fǎng)問(wèn)底層 API。執(zhí)行回調(diào) 將為您提供對(duì)對(duì)象的引用。 有關(guān)詳細(xì)信息,請(qǐng)參閱執(zhí)行回調(diào)部分。??ReactiveVaultTemplate????WebClient??

現(xiàn)在讓我們看一個(gè)如何在 Spring 容器上下文中使用 Vault 的示例。

10.3. 注冊(cè)和配置 Spring Vault bean

使用 Spring Vault 不需要 Spring 上下文。但是,在托管上下文中注冊(cè)的實(shí)例將參與 在 Spring IoC 容器提供的生命周期事件中。這對(duì)于在以下情況下處置活動(dòng)的保管庫(kù)會(huì)話(huà)非常有用 應(yīng)用程序關(guān)閉。您還可以從在整個(gè)應(yīng)用程序中重用同一實(shí)例中受益。??ReactiveVaultTemplate????VaultTokenSupplier????ReactiveVaultTemplate??

Spring Vault 附帶了一個(gè)支持配置類(lèi),該類(lèi)提供 Bean 定義 用于 Spring 上下文。應(yīng)用程序配置 類(lèi)通常從 并且需要 提供特定于環(huán)境的其他詳細(xì)信息。??AbstractVaultConfiguration??

從需求擴(kuò)展到實(shí)現(xiàn) " VaultEndpoint vaultEndpoint()" 和方法。??AbstractVaultConfiguration????ClientAuthentication clientAuthentication()??

例 9.使用基于 Java 的 Bean 元數(shù)據(jù)注冊(cè) Spring Vault 對(duì)象

@Configurationpublic class AppConfig extends AbstractReactiveVaultConfiguration {    /**     * Specify an endpoint for connecting to Vault.     */    @Override    public VaultEndpoint vaultEndpoint() {        return new VaultEndpoint();                                }    /**     * Configure a client authentication.     * Please consider a more secure authentication method     * for production use.     */    @Override    public ClientAuthentication clientAuthentication() {        return new TokenAuthentication("…");                       }}

創(chuàng)建一個(gè)缺省情況下指向 的新節(jié)點(diǎn)。??VaultEndpoint????https://localhost:8200??

此示例用于快速入門(mén)。

有關(guān)支持的身份驗(yàn)證方法的詳細(xì)信息,請(qǐng)參閱身份驗(yàn)證方法?。??TokenAuthentication??

10.4. 會(huì)話(huà)管理

Spring Vault 需要一個(gè)令牌來(lái)驗(yàn)證 Vault 請(qǐng)求。 有關(guān)身份驗(yàn)證的詳細(xì)信息,請(qǐng)參閱身份驗(yàn)證方法。 反應(yīng)式客戶(hù)端需要一個(gè)非阻塞令牌供應(yīng)商,其合約已定義 在。令牌可以是靜態(tài)的,也可以通過(guò)聲明的身份驗(yàn)證流獲取。 保管庫(kù)登錄不應(yīng)發(fā)生在每個(gè)經(jīng)過(guò)身份驗(yàn)證的保管庫(kù)交互中,但應(yīng) 會(huì)話(huà)令牌應(yīng)在整個(gè)會(huì)話(huà)中保留。這方面由 會(huì)話(huà)管理器實(shí)現(xiàn) ,例如 。??VaultTokenSupplier????ReactiveSessionManager????ReactiveLifecycleAwareSessionManager??

10.5. 執(zhí)行回調(diào)

所有 Spring 模板類(lèi)的一個(gè)共同設(shè)計(jì)特征是所有功能 路由到其中一個(gè)模板執(zhí)行回調(diào)方法。這有助于確保 執(zhí)行異常和可能需要的任何資源管理 一致性。雖然在JDBC和JMS的情況下,這需要更大的需求。 與 Vault 相比,它仍然為訪(fǎng)問(wèn)和日志記錄提供了一個(gè)位置。 因此,使用執(zhí)行回調(diào)是訪(fǎng)問(wèn)保管庫(kù) API 的首選方式 執(zhí)行我們尚未在 上公開(kāi)為方法的不常見(jiàn)操作。??ReactiveVaultTemplate??

下面是執(zhí)行回調(diào)方法的列表。

?? T??doWithVault組成反應(yīng)式 序列給定的,允許在沒(méi)有會(huì)話(huà)上下文的情況下與 Vault 交互。(Function clientCallback)WebClient?? T??doWithSession組成反應(yīng)式 序列給定的,允許在經(jīng)過(guò)身份驗(yàn)證的會(huì)話(huà)中與 Vault 交互。(Function clientCallback)WebClient

下面是一個(gè)使用回調(diào)初始化 Vault 的示例:

reactiveVaultOperations.doWithVault(webClient -> {    return webClient.put()                    .uri("/sys/init")                    .syncBody(request)                    .retrieve()                    .toEntity(VaultInitializationResponse.class);});

11. 庫(kù)屬性源支持

Vault 可以以許多不同的方式使用。一個(gè)特定的用例是使用 用于存儲(chǔ)加密屬性的保管庫(kù)。Spring Vault 支持將 Vault 作為屬性 source 以使用 Spring 的PropertySource 抽象獲取配置屬性。

您可以在其他特性源中引用存儲(chǔ)在 Vault 中的特性,也可以將值注入與 一起使用。引導(dǎo)需要存儲(chǔ)在 Vault 中的數(shù)據(jù)的 Bean 時(shí)需要特別注意。此時(shí)必須初始化 才能從 Vault 檢索屬性。??@Value(…)????VaultPropertySource??

Spring Boot/Spring Cloud 用戶(hù)可以從Spring Cloud Vault中受益。 在應(yīng)用程序啟動(dòng)期間初始化各種屬性源的配置集成。

11.1. 注冊(cè)??VaultPropertySource??

Spring Vault 提供了一個(gè)與 Vault 一起使用以獲得 性能。它使用嵌套元素來(lái)公開(kāi)存儲(chǔ)的屬性和 在保管庫(kù)中加密。??VaultPropertySource????data??

ConfigurableApplicationContext ctx = new GenericApplicationContext();MutablePropertySources sources = ctx.getEnvironment().getPropertySources();sources.addFirst(new VaultPropertySource(vaultTemplate, "secret/my-application"));

在上面的代碼中,已添加具有最高優(yōu)先級(jí) 在搜索中。如果它包含“foo”屬性,它將被檢測(cè)并返回 在任何其他財(cái)產(chǎn)之前。 公開(kāi)了許多允許精確 操作屬性源集。??VaultPropertySource????foo????PropertySource????MutablePropertySources??

11.2. @VaultPropertySource

注釋提供了方便的聲明性 將 a 添加到 Spring 以與類(lèi)結(jié)合使用的機(jī)制。??@VaultPropertySource????PropertySource????Environment????@Configuration??

??@VaultPropertySource??采用 Vault 路徑,例如 并在 中公開(kāi)存儲(chǔ)在節(jié)點(diǎn)上的數(shù)據(jù)。 支持與租約關(guān)聯(lián)的機(jī)密的租約續(xù)訂 (即來(lái)自后端的憑據(jù))和終端上的憑據(jù)輪換 租約到期。默認(rèn)情況下,租約續(xù)訂處于禁用狀態(tài)。??secret/my-application????PropertySource????@VaultPropertySource????mysql??

例 10.存儲(chǔ)在庫(kù)中的屬性

{  // …  "data": {    "database": {      "password": ...    },    "user.name": ...,  }  // …}

例 11.聲明??@VaultPropertySource??

@Configuration@VaultPropertySource("secret/my-application")public class AppConfig {    @Autowired Environment env;    @Bean    public TestBean testBean() {        TestBean testBean = new TestBean();        testBean.setUser(env.getProperty("user.name"));        testBean.setPassword(env.getProperty("database.password"));        return testBean;    }}

例 12.聲明具有憑據(jù)輪換和前綴的??@VaultPropertySource??

@Configuration@VaultPropertySource(value = "aws/creds/s3-access",                     propertyNamePrefix = "aws.",                     renewal = Renewal.ROTATE)public class AppConfig {  // provides aws.access_key and aws.secret_key properties}

從密鑰后端獲取的機(jī)密與 TTL () 相關(guān)聯(lián),但與租約 ID 無(wú)關(guān)。 Spring Vault 在到達(dá)其 TTL 時(shí)會(huì)輪換通用機(jī)密。??generic????refresh_interval????PropertySource??

您可以使用 從受版本控制的鍵值后端獲取最新的密鑰版本。確保不在路徑中包含該段。??@VaultPropertySource????data/??

路徑中存在的任何占位符都是根據(jù)已針對(duì)環(huán)境注冊(cè)的屬性源集解析的,如以下示例所示:??${…}????@VaultPropertySource??

例 13.使用占位符聲明路徑??@VaultPropertySource??

@Configuration@VaultPropertySource(value = "aws/creds/${my.placeholder:fallback/value}",                     propertyNamePrefix = "aws.",                     renewal = Renewal.ROTATE)public class AppConfig {}

假設(shè)該屬性源存在于已注冊(cè)的屬性源之一(例如,系統(tǒng)屬性或環(huán)境變量)中,則占位符將解析為相應(yīng)的值。 如果不是,則用作默認(rèn)值。 如果未指定默認(rèn)值且無(wú)法解析屬性,則會(huì)引發(fā) 。??my.placeholder????fallback/value????IllegalArgumentException??

在某些情況下,嚴(yán)格控制可能是不可能的或不切實(shí)際的 使用批注時(shí)的屬性源排序。 例如,如果上述類(lèi)是通過(guò) 組件掃描,排序很難預(yù)測(cè)。 在這種情況下 - 如果覆蓋很重要 - 建議 用戶(hù)回退到使用編程屬性源 API。 有關(guān)詳細(xì)信息,請(qǐng)參閱ConfigurableEnvironment和muttablePropertySources。??@VaultPropertySource????@Configuration??

12. 庫(kù)存儲(chǔ)庫(kù)

使用和映射到 Java 類(lèi)的響應(yīng)允許基本的數(shù)據(jù)操作,如讀取、寫(xiě)入 并刪除。Vault存儲(chǔ)庫(kù)在Vault之上應(yīng)用Spring Data的存儲(chǔ)庫(kù)概念。 Vault 存儲(chǔ)庫(kù)公開(kāi)了基本的 CRUD 功能,并支持具有謂詞約束的查詢(xún)派生 Id 屬性,分頁(yè)和排序。??VaultTemplate??

在Spring DataCommons參考文檔中閱讀有關(guān)Spring Data Repository的更多信息。參考文檔將向您介紹 Spring 數(shù)據(jù)存儲(chǔ)庫(kù)。

12.1. 用法

要訪(fǎng)問(wèn)存儲(chǔ)在 Vault 中的域?qū)嶓w,您可以利用存儲(chǔ)庫(kù)支持來(lái)大大簡(jiǎn)化這些實(shí)體的實(shí)施。

例 14。示例憑據(jù)實(shí)體

@Secretpublic class Credentials {  @Id String id;  String password;  String socialSecurityNumber;  Address address;}

我們這里有一個(gè)非常簡(jiǎn)單的域?qū)ο蟆U?qǐng)注意,它有一個(gè)名為 annotated with 的屬性,并對(duì)其類(lèi)型進(jìn)行了注釋。 這兩個(gè)負(fù)責(zé)創(chuàng)建用于將對(duì)象作為 JSON 保留在保管庫(kù)中的實(shí)際密鑰。??id????org.springframework.data.annotation.Id????@Secret??

批注的屬性以及命名的屬性被視為標(biāo)識(shí)符屬性。 那些有注釋的人比其他人更受青睞。??@Id????id??

下一步是聲明使用域?qū)ο蟮拇鎯?chǔ)庫(kù)接口。

例 15。實(shí)體的基本存儲(chǔ)庫(kù)接口??Credentials??

public interface CredentialsRepository extends CrudRepository {}

隨著我們的存儲(chǔ)庫(kù)擴(kuò)展,它提供了基本的 CRUD 和查詢(xún)方法。庫(kù)存儲(chǔ)庫(kù) 需要 Spring 數(shù)據(jù)組件。確保在類(lèi)路徑中包含 和項(xiàng)目。??CrudRepository????spring-data-commons????spring-data-keyvalue??

實(shí)現(xiàn)此目的的最簡(jiǎn)單方法是設(shè)置依賴(lài)項(xiàng)管理并將工件添加到您的:??pom.xml??

然后將以下內(nèi)容添加到依賴(lài)項(xiàng)部分。??pom.xml??

例 16。使用彈簧數(shù)據(jù)BOM

            org.springframework.data      spring-data-releasetrain      Moore-SR12      import      pom              org.springframework.vault    spring-vault-core    2.2.3.RELEASE        org.springframework.data    spring-data-keyvalue      

我們需要在兩者之間將東西粘合在一起的東西是相應(yīng)的 Spring 配置。

例 17.JavaConfig for Vault Repository

@Configuration@EnableVaultRepositoriespublic class ApplicationConfig {  @Bean  public VaultTemplate vaultTemplate() {    return new VaultTemplate(…);  }}

鑒于上述設(shè)置,我們可以繼續(xù)注入到我們的組件中。??CredentialsRepository??

例 18。對(duì)個(gè)人實(shí)體的訪(fǎng)問(wèn)權(quán)限

@Autowired CredentialsRepository repo;public void basicCrudOperations() {  Credentials creds = new Credentials("heisenberg", "327215", "AAA-GG-SSSS");  rand.setAddress(new Address("308 Negra Arroyo Lane", "Albuquerque", "New Mexico", "87104"));  repo.save(creds);                                          repo.findOne(creds.getId());                               repo.count();                                              repo.delete(creds);                                      }

使用鍵模式存儲(chǔ)保管庫(kù)哈希內(nèi)部的屬性,

在本例中,在通用密鑰后端中。??Credentials????keyspace/id????credentials/heisenberg??

使用提供的 ID 檢索存儲(chǔ)在 中的對(duì)象。??keyspace/id??

計(jì)算 上定義的密鑰空間憑據(jù)中可用的實(shí)體總數(shù)。??@Secret????Credentials??

從保管庫(kù)中刪除給定對(duì)象的密鑰。

12.2. 對(duì)象到文件庫(kù) JSON 映射

保管庫(kù)存儲(chǔ)庫(kù)使用 JSON 作為交換格式將對(duì)象存儲(chǔ)在保管庫(kù)中。JSON 和 JSON 之間的對(duì)象映射 該實(shí)體由 完成。轉(zhuǎn)換器讀取和寫(xiě)入包含正文 從 .從 Vault 讀取,主體由 杰克遜成和. 默認(rèn)實(shí)現(xiàn)讀取 與嵌套值,對(duì)象和 將它們轉(zhuǎn)換為實(shí)體,反之亦然。??VaultConverter????SecretDocument????VaultResponse????VaultResponse????Map????String????Object????VaultConverter????Map????List????Map??

給定前面部分中的類(lèi)型,默認(rèn)映射如下所示:??Credentials??

{  "_class": "org.example.Credentials",                   "password", "327215",                                  "socialSecurityNumber": "AAA-GG-SSSS",  "address": {                                             "street": "308 Negra Arroyo Lane",    "city": "Albuquerque",    "state": "New Mexico",    "zip":"87104"  }}

該屬性包含在根級(jí)別以及任何嵌套接口或抽象類(lèi)型中。??_class??

簡(jiǎn)單屬性值按路徑映射。

復(fù)雜類(lèi)型的屬性映射為嵌套對(duì)象。

該屬性必須映射到 。??@Id????String??

Table 1. Default Mapping Rules

類(lèi)型

樣本

映射值

簡(jiǎn)單類(lèi)型(例如。字符串)

字符串名字 =“瓦爾特”;

名字 = “瓦爾特”

復(fù)雜類(lèi)型(例如地址)

地址地址 = 新地址(“308 Negra Arroyo Lane”);

地址: { “街道”: “308 Negra Arroyo Lane” }

簡(jiǎn)單類(lèi)型列表

列表<字符串>昵稱(chēng) = asList(“walt”, “heisenberg”);

昵稱(chēng):[“沃爾特”、“海森堡”]

簡(jiǎn)單類(lèi)型的地圖

Map atts = asMap(“age”, 51)

atts : {“age” : 51}

復(fù)雜類(lèi)型列表

列表<地址> 地址 = asList(新地址(“308...

地址: [{ “街道”: “308 Negra Arroyo Lane” }, ...]

您可以通過(guò)在 中注冊(cè) 來(lái)自定義映射行為。 這些轉(zhuǎn)換器可以負(fù)責(zé)從/轉(zhuǎn)換為類(lèi)型,例如,而第一個(gè)轉(zhuǎn)換器適用于將簡(jiǎn)單屬性轉(zhuǎn)換為,最后一個(gè)復(fù)雜類(lèi)型適用于將 JSON 轉(zhuǎn)換為 表示法。第二個(gè)選項(xiàng)提供對(duì)結(jié)果的完全控制。將對(duì)象寫(xiě)入將刪除內(nèi)容并重新創(chuàng)建整個(gè)條目,因此未映射的數(shù)據(jù)將丟失。??Converter????VaultCustomConversions????LocalDate????SecretDocument????SecretDocument????Vault??

12.3. 查詢(xún)和查詢(xún)方法

查詢(xún)方法允許從方法名稱(chēng)自動(dòng)派生簡(jiǎn)單查詢(xún)。保險(xiǎn)柜沒(méi)有查詢(xún)引擎,但 需要直接訪(fǎng)問(wèn) HTTP 上下文路徑。保險(xiǎn)柜查詢(xún)方法將保險(xiǎn)柜的 API 可能性轉(zhuǎn)換為查詢(xún)。 查詢(xún)方法執(zhí)行在上下文路徑下列出子項(xiàng),對(duì) Id 應(yīng)用篩選,可以選擇限制 具有偏移量/限制的 id 流,并在獲取結(jié)果后應(yīng)用排序。

例 19。示例存儲(chǔ)庫(kù)查詢(xún)方法

public interface CredentialsRepository extends CrudRepository {  List findByIdStartsWith(String prefix);}

Vault 存儲(chǔ)庫(kù)的查詢(xún)方法僅支持對(duì)屬性具有謂詞的查詢(xún)。??@Id??

下面概述了保險(xiǎn)柜支持的關(guān)鍵字。

Table 2. Supported keywords for query methods

關(guān)鍵詞

樣本

??After???,??GreaterThan??

??findByIdGreaterThan(String id)??

??GreaterThanEqual??

??findByIdGreaterThanEqual(String id)??

??Before???,??LessThan??

??findByIdLessThan(String id)??

??LessThanEqual??

??findByIdLessThanEqual(String id)??

??Between??

??findByIdBetween(String from, String to)??

??In??

??findByIdIn(Collection ids)??

??NotIn??

??findByIdNotIn(Collection ids)??

??Like???, ,??StartingWith????EndingWith??

??findByIdLike(String id)??

??NotLike???,??IsNotLike??

??findByIdNotLike(String id)??

??Containing??

??findByFirstnameContaining(String id)??

??NotContaining??

??findByFirstnameNotContaining(String name)??

??Regex??

??findByIdRegex(String id)??

??(No keyword)??

??findById(String name)??

??Not??

??findByIdNot(String id)??

??And??

??findByLastnameAndFirstname??

??Or??

??findByLastnameOrFirstname??

??Is,Equals??

??findByFirstname???,,??findByFirstnameIs????findByFirstnameEquals??

??Top,First??

??findFirst10ByFirstname???,??findTop5ByFirstname??

12.3.1. 排序和分頁(yè)

查詢(xún)方法通過(guò)在內(nèi)存中選擇從中檢索的子列表(偏移/限制)ID 來(lái)支持排序和分頁(yè) 保險(xiǎn)柜上下文路徑。與查詢(xún)方法謂詞不同,排序不限于特定字段。 在 Id 過(guò)濾后應(yīng)用未分頁(yè)排序,并從保管庫(kù)獲取所有生成的機(jī)密。這邊 查詢(xún)方法僅提取也作為結(jié)果的一部分返回的結(jié)果。

使用分頁(yè)和排序需要在過(guò)濾 ID 之前進(jìn)行秘密獲取,這會(huì)影響性能。 排序和分頁(yè)保證返回相同的結(jié)果,即使 Vault 返回的 Id 的自然順序發(fā)生更改也是如此。 因此,首先從 Vault 獲取所有 Id,然后應(yīng)用排序,然后進(jìn)行過(guò)濾和偏移/限制。

例 20。分頁(yè)和排序存儲(chǔ)庫(kù)

public interface CredentialsRepository extends PagingAndSortingRepository {  List findTop10ByIdStartsWithOrderBySocialSecurityNumberDesc(String prefix);  List findByIdStarts(String prefix, Pageable pageRequest);}

13. 客戶(hù)支持

Spring Vault 支持各種 HTTP 客戶(hù)端訪(fǎng)問(wèn) Vault 的 HTTP API。Spring Vault 使用RestTemplate作為訪(fǎng)問(wèn) Vault 的主要界面。 專(zhuān)用客戶(hù)端支持源自自定義的 SSL配置,該配置的范圍僅限于 Spring Vault 的客戶(hù)端組件。

Spring Vault 支持以下 HTTP 命令式客戶(hù)端:

Java的內(nèi)置(默認(rèn)客戶(hù)端)HttpURLConnectionApache Http Components內(nèi)蒂OkHttp 3

Spring Vault 的反應(yīng)式集成支持以下反應(yīng)式 HTTP 客戶(hù)端:

反應(yīng)器網(wǎng)碼頭

使用特定客戶(hù)機(jī)要求相應(yīng)的依賴(lài)關(guān)系在類(lèi)路徑上可用 因此,Spring Vault 可以使用可用的客戶(hù)端與 Vault 進(jìn)行通信。

13.1. Java的內(nèi)置??HttpURLConnection??

Java的內(nèi)置功能開(kāi)箱即用,無(wú)需額外 配置。使用帶有有關(guān) SSL 配置的限制。 Spring Vault 不會(huì)像以前那樣應(yīng)用自定義的 SSL 配置需要對(duì) JVM 進(jìn)行深度重新配置。此配置將影響所有 依賴(lài)于默認(rèn) SSL 上下文的組件。使用 配置 SSL 設(shè)置需要將這些設(shè)置作為“系統(tǒng)屬性”提供。有關(guān)更多詳細(xì)信息,請(qǐng)參閱自定義 JSSE。??HttpURLConnection????HttpURLConnection????HttpURLConnection??

13.2. 外部客戶(hù)端

您可以使用外部客戶(hù)端訪(fǎng)問(wèn)保險(xiǎn)柜的 API。只需添加以下其中一項(xiàng) 項(xiàng)目的依賴(lài)項(xiàng)。如果使用Spring Vault 的依賴(lài)項(xiàng) BOM,則可以省略版本號(hào)

例 21。Apache Http Components Dependency

  org.apache.httpcomponents  httpclient

Apache HttpClient 的線(xiàn)路日志記錄可以通過(guò)日志記錄配置啟用。請(qǐng)確保不要意外啟用線(xiàn)路日志記錄,因?yàn)槿罩究赡軙?huì)以純文本形式公開(kāi)應(yīng)用程序和 Vault 之間的流量(令牌和機(jī)密)。

例 22。Netty Dependency

  io.netty  netty-all

例 23。方形 OkHttp 3

  com.squareup.okhttp3  okhttp

例 24。反應(yīng)器網(wǎng)

  io.projectreactor.netty  reactor-netty

例 25。碼頭

  org.eclipse.jetty  jetty-reactive-httpclient

13.3. 庫(kù)客戶(hù)端 SSL 配置

可以通過(guò)設(shè)置各種屬性來(lái)配置 SSL。 您可以設(shè)置配置為配置 JVM 范圍的 SSL 設(shè)置或配置為僅為 Spring Vault 設(shè)置 SSL 設(shè)置。??SslConfiguration????javax.net.ssl.trustStore????SslConfiguration??

SslConfiguration sslConfiguration = SslConfiguration.create(                new FileSystemResource("client-cert.jks"), "changeit".toCharArray(),    new FileSystemResource("truststore.jks"), "changeit".toCharArray());SslConfiguration.forTrustStore(new FileSystemResource("keystore.jks"),                                        "changeit".toCharArray())SslConfiguration.forKeyStore(new FileSystemResource("keystore.jks"),                                          "changeit".toCharArray())SslConfiguration.forKeyStore(new FileSystemResource("keystore.jks"),                                          "changeit".toCharArray(),                                      KeyConfiguration.of("key-password".toCharArray(),                                      "my-key-alias"))

完整配置。

僅配置信任存儲(chǔ)設(shè)置。

僅配置密鑰存儲(chǔ)設(shè)置。

通過(guò)提供密鑰配置僅配置密鑰存儲(chǔ)設(shè)置。

請(qǐng)注意,只能提供 在 Apache Http 組件或 OkHttp 客戶(hù)端時(shí)應(yīng)用 在您的類(lèi)路徑上。??SslConfiguration??

14. 身份驗(yàn)證方法

不同的組織對(duì)安全性有不同的要求 和身份驗(yàn)證。保險(xiǎn)柜通過(guò)傳送多個(gè)身份驗(yàn)證來(lái)反映這一需求 方法。Spring Vault 支持多種身份驗(yàn)證機(jī)制。

14.1. 外部化登錄憑據(jù)

首次訪(fǎng)問(wèn)安全系統(tǒng)稱(chēng)為安全引入。 任何客戶(hù)端都需要臨時(shí)或永久憑據(jù)才能訪(fǎng)問(wèn)保險(xiǎn)柜。外部化憑據(jù) 是保持代碼可維護(hù)性的良好模式,但存在增加泄露的風(fēng)險(xiǎn)。

向任何一方披露登錄憑據(jù)都允許登錄到 Vault 并訪(fǎng)問(wèn)以下機(jī)密: 由基礎(chǔ)角色允許。選擇適當(dāng)?shù)目蛻?hù)端身份驗(yàn)證和 將憑據(jù)注入應(yīng)用程序需要接受風(fēng)險(xiǎn)評(píng)估。

Spring"s PropertySource抽象是天作之合 將配置保留在應(yīng)用程序代碼之外。您可以使用系統(tǒng)屬性、環(huán)境 用于存儲(chǔ)登錄憑據(jù)的變量或?qū)傩晕募?。每種方法都有自己的屬性。 請(qǐng)記住,命令行和環(huán)境屬性可以使用適當(dāng)?shù)?操作系統(tǒng)訪(fǎng)問(wèn)級(jí)別。

例 26。外部化到屬性文件??vault.token??

@PropertySource("configuration.properties")@Configurationpublic class Config extends AbstractVaultConfiguration {    @Override    public ClientAuthentication clientAuthentication() {        return new TokenAuthentication(getEnvironment().getProperty("vault.token"));    }}

彈簧允許多種方式獲得。使用時(shí),注入通孔不會(huì)提供,因?yàn)榄h(huán)境豆仍在建設(shè)中,自動(dòng)布線(xiàn)將在稍后階段出現(xiàn)。您的配置類(lèi)應(yīng)該實(shí)現(xiàn)并獲取來(lái)自 .??Environment????VaultPropertySource????@Autowired Environment environment????Environment????ApplicationContextAware????Environment????ApplicationContext??

有關(guān)在組件和其他屬性源中引用屬性的示例.java請(qǐng)參閱 SecurePropertyUsage。

14.2. 令牌身份驗(yàn)證

令牌是保管庫(kù)中身份驗(yàn)證的核心方法。 令牌身份驗(yàn)證需要提供靜態(tài)令牌。

令牌身份驗(yàn)證是默認(rèn)的身份驗(yàn)證方法。 如果令牌被披露為非預(yù)期方,它將獲得對(duì) Vault 的訪(fǎng)問(wèn)權(quán)限,并且 可以訪(fǎng)問(wèn)目標(biāo)客戶(hù)端的機(jī)密。

通常,令牌身份驗(yàn)證用于創(chuàng)建和續(xù)訂令牌的方案 外部(如橋生保險(xiǎn)庫(kù)服務(wù)代理)。 根據(jù)實(shí)際設(shè)置,您可能需要也可能不需要令牌續(xù)訂和吊銷(xiāo)。 有關(guān) TTL 和令牌吊銷(xiāo)的詳細(xì)信息,請(qǐng)參閱LifecycleAwareSessionManager。

@Configurationclass AppConfig extends AbstractVaultConfiguration {    // …    @Override    public ClientAuthentication clientAuthentication() {        return new TokenAuthentication("…");    }    // …}

另請(qǐng)參閱:

保管庫(kù)文檔:令牌保管庫(kù)文檔:使用令牌身份驗(yàn)證后端

14.3. 應(yīng)用標(biāo)識(shí)身份驗(yàn)證

保管庫(kù)已棄用 AppId 身份驗(yàn)證。請(qǐng)改用應(yīng)用角色身份驗(yàn)證。

保險(xiǎn)柜支持由兩個(gè)難以猜測(cè)的令牌組成的AppId身份驗(yàn)證。應(yīng)用標(biāo)識(shí) 默認(rèn)為靜態(tài)配置。 第二個(gè)令牌是 UserId,它是由應(yīng)用程序確定的部分, 通常與運(yùn)行時(shí)環(huán)境相關(guān)。IP 地址、Mac 地址或 Docker 容器名稱(chēng)就是很好的例子。彈簧穹頂支架 IP 地址、Mac 地址和靜態(tài)用戶(hù) ID(例如,通過(guò)系統(tǒng)屬性提供)。 IP 和 Mac 地址表示為十六進(jìn)制編碼的 SHA256 哈希。??spring.application.name??

基于 IP 地址的用戶(hù) ID 使用本地主機(jī)的 IP 地址。

@Configurationclass AppConfig extends AbstractVaultConfiguration {    // …    @Override    public ClientAuthentication clientAuthentication() {        AppIdAuthenticationOptions options = AppIdAuthenticationOptions.builder()                .appId("myapp")                .userIdMechanism(new IpAddressUserId())                .build();        return new AppIdAuthentication(options, restOperations());    }    // …}

從命令行生成 IP 地址 UserId 的相應(yīng)命令是:

$ echo -n 192.168.99.1 | sha256sum

包括引線(xiàn)到不同哈希值的換行符 因此,請(qǐng)確保包含標(biāo)志。??echo????-n??

基于 Mac 地址的用戶(hù) ID 從 本地主機(jī)綁定設(shè)備。該配置還允許指定 選擇正確設(shè)備的提示。的值是可選的,可以是接口 名稱(chēng)或接口索引(從 0 開(kāi)始)。??network-interface????network-interface??

@Configurationclass AppConfig extends AbstractVaultConfiguration {    // …    @Override    public ClientAuthentication clientAuthentication() {        AppIdAuthenticationOptions options = AppIdAuthenticationOptions.builder()                .appId("myapp")                .userIdMechanism(new MacAddressUserId())                .build();        return new AppIdAuthentication(options, restOperations());    }    // …}

從命令行生成 Mac 地址 UserId 的相應(yīng)命令是:

$ echo -n 0AFEDE1234AC | sha256sum

Mac 地址指定為大寫(xiě),不帶冒號(hào)。 包括引線(xiàn)到不同哈希值的換行符 因此,請(qǐng)確保包含標(biāo)志。??echo????-n??

標(biāo)簽: 身份驗(yàn)證 應(yīng)用程序 詳細(xì)信息

上一篇:微動(dòng)態(tài)丨#yyds干貨盤(pán)點(diǎn)#配置 dev-server
下一篇:世界熱推薦:如何在 Linux 下使用 TC 優(yōu)雅的實(shí)現(xiàn)網(wǎng)絡(luò)限流