
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ù)模塊功能集。
本節(jié)提供對(duì) Spring 和 Vault 的基本介紹。 它包含有關(guān)后續(xù)開(kāi)發(fā)以及如何獲得支持的詳細(xì)信息。
文檔的其余部分引用了 Spring Vault 功能并假設(shè) 用戶(hù)熟悉HashiCorp Vault以及Spring概念。
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è)以獲取更多信息。
安全性和使用機(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等。
Spring Vault 2.x 二進(jìn)制文件需要 JDK 8.0 及以上版本,以及Spring Framework5.2.12.RELEASE 及更高版本。
在保險(xiǎn)庫(kù)方面,保險(xiǎn)柜至少為0.6。
學(xué)習(xí)一個(gè)新框架并不總是直截了當(dāng)?shù)?。在本?jié)中,我們嘗試提供我們認(rèn)為易于遵循的指南,以便從Spring Vault模塊開(kāi)始。但是,如果您遇到問(wèn)題或只是在尋找建議,請(qǐng)隨時(shí)使用以下鏈接之一:
有幾個(gè)支持選項(xiàng)可用:
在Stackoverflow上發(fā)布有關(guān) Spring Vault 的問(wèn)題,以共享信息并互相幫助。請(qǐng)注意,只有發(fā)布時(shí)才需要注冊(cè)。
專(zhuān)業(yè)的,從源頭支持,保證響應(yīng)時(shí)間,可從Spring Vault和Spring背后的公司Pivotal Sofware,Inc.獲得。
有關(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ì)。
@VaultPropertySource
中的 SpEL 支持 。@Secret
添加對(duì) Jetty 作為反應(yīng)式 HttpClient 的支持。??LifecycleAwareSessionManager?
?并發(fā)出現(xiàn)在的 s。ReactiveLifecycleAwareSessionManager
AuthenticationEvent
PCF 身份驗(yàn)證。棄用 。請(qǐng)按照HashiCorp Vault的建議使用。AppIdAuthentication
AppRoleAuthentication
??CubbyholeAuthentication?
?和包裝現(xiàn)在默認(rèn)使用端點(diǎn)。AppRoleAuthentication
sys/wrapping/unwrap
Kotlin 協(xié)程對(duì) 的支持。ReactiveVaultOperations
BytesKeyGenerator
BytesEncryptor
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?
?
查找兼容版本的 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
Spring Vault 的當(dāng)前版本需要 Spring Framework 5.2.12.發(fā)布或更好。這些模塊也可能使用較舊的錯(cuò)誤修復(fù) 該次要版本的版本。但是,使用最新版本 強(qiáng)烈建議在這一代內(nèi)。
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); VaultResponseSupportresponse = 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.VaultEndpoint
ClientAuthentication
保管庫(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ì)象。類(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í)例。? |
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ò)它的界面.? |
雖然有許多方便的方法可以幫助您輕松 如果您需要直接訪(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 的示例。
使用 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)。? |
此示例用于快速入門(mén)。 有關(guān)支持的身份驗(yàn)證方法的詳細(xì)信息,請(qǐng)參閱身份驗(yàn)證方法?。? |
例 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()); }}
? |
方法的依賴(lài)項(xiàng)可以從配置中獲取,也可以由配置提供。? |
在某些情況下,創(chuàng)建自定義配置類(lèi)可能很麻煩。 看看允許使用 來(lái)自現(xiàn)有屬性源和 Spring 的屬性。閱讀更多 在使用環(huán)境保管庫(kù)配置中。? |
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)配置 。SessionManager
AsyncTaskExecutor
LifecycleAwareSessionManager
AbstractVaultConfiguration
?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.uri
SSL 配置密鑰庫(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.authentication
TOKEN
TOKEN
APPID
APPROLE
AWS_EC2
AZURE
CERT
CUBBYHOLE
KUBERNETES
)特定于身份驗(yàn)證的屬性鍵
?令牌身份驗(yàn)證?
金庫(kù)令牌:vault.token
?應(yīng)用標(biāo)識(shí)身份驗(yàn)證?
AppId 路徑:(默認(rèn)為vault.app-id.app-id-path
app-id
)應(yīng)用標(biāo)識(shí):vault.app-id.app-id
用戶(hù)標(biāo)識(shí):。 并使用各自的用戶(hù) ID 機(jī)制。 任何其他值都與 一起使用。vault.app-id.user-id
MAC_ADDRESS
IP_ADDRESS
MacAddressUserId
IpAddressUserId
StaticUserId
?應(yīng)用角色身份驗(yàn)證?
應(yīng)用角色路徑:(默認(rèn)為vault.app-role.app-role-path
approle
)角色標(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-path
aws-ec2
)角色:vault.aws-ec2.role
角色 ID:(已棄用:改用)vault.aws-ec2.role-id
vault.aws-ec2.role
身份證件網(wǎng)址:(默認(rèn)為vault.aws-ec2.identity-document
http://169.254.169.254/latest/dynamic/instance-identity/pkcs7
)?Azure (MSI) 身份驗(yàn)證?
Azure MSI 路徑:(默認(rèn)為vault.azure-msi.azure-path
azure
)角色:vault.azure-msi.role
元數(shù)據(jù)服務(wù) URL:(默認(rèn)為vault.azure-msi.metadata-service
http://169.254.169.254/metadata/instance?api-version=2017-08-01
)身份令牌服務(wù) URL:(默認(rèn)為vault.azure-msi.identity-token-service
http://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.tokenKubernetes 身份驗(yàn)證
Kubernetes 路徑:(默認(rèn)為vault.kubernetes.kubernetes-path
kubernetes
)角色:vault.kubernetes.role
服務(wù)帳戶(hù)令牌文件的路徑:(默認(rèn)為vault.kubernetes.service-account-token-file
/var/run/secrets/kubernetes.io/serviceaccount/token
)所有 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)
RestOperationsCallback
RestOperations
?? 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
本節(jié)介紹有關(guān)使用 Spring Vault 的響應(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ò)容量釋放。
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í)例。? |
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ò)它的界面.? |
未顯式公開(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 的示例。
使用 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)。? |
此示例用于快速入門(mén)。 有關(guān)支持的身份驗(yàn)證方法的詳細(xì)信息,請(qǐng)參閱身份驗(yàn)證方法?。? |
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?
?
所有 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);});
Vault 可以以許多不同的方式使用。一個(gè)特定的用例是使用 用于存儲(chǔ)加密屬性的保管庫(kù)。Spring Vault 支持將 Vault 作為屬性 source 以使用 Spring 的PropertySource 抽象獲取配置屬性。
您可以在其他特性源中引用存儲(chǔ)在 Vault 中的特性,也可以將值注入與 一起使用。引導(dǎo)需要存儲(chǔ)在 Vault 中的數(shù)據(jù)的 Bean 時(shí)需要特別注意。此時(shí)必須初始化 才能從 Vault 檢索屬性。? |
Spring Boot/Spring Cloud 用戶(hù)可以從Spring Cloud Vault中受益。 在應(yīng)用程序啟動(dòng)期間初始化各種屬性源的配置集成。 |
?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?
?
注釋提供了方便的聲明性 將 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ī)密。? |
您可以使用 從受版本控制的鍵值后端獲取最新的密鑰版本。確保不在路徑中包含該段。? |
路徑中存在的任何占位符都是根據(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?
?
使用和映射到 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ù)。 |
要訪(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í)符屬性。 那些有注釋的人比其他人更受青睞。? |
下一步是聲明使用域?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)部的屬性, 在本例中,在通用密鑰后端中。? |
使用提供的 ID 檢索存儲(chǔ)在 中的對(duì)象。? |
計(jì)算 上定義的密鑰空間憑據(jù)中可用的實(shí)體總數(shù)。? |
從保管庫(kù)中刪除給定對(duì)象的密鑰。 |
保管庫(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)型中。? |
簡(jiǎn)單屬性值按路徑映射。 |
復(fù)雜類(lèi)型的屬性映射為嵌套對(duì)象。 |
該屬性必須映射到 。? |
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 : {“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?
?
查詢(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)。? |
下面概述了保險(xiǎn)柜支持的關(guān)鍵字。
Table 2. Supported keywords for query methods
關(guān)鍵詞 | 樣本 |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
? | ? |
查詢(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);}
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ù)端)HttpURLConnection
Apache Http Components內(nèi)蒂OkHttp 3Spring 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)行通信。
?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?
?
您可以使用外部客戶(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
可以通過(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?
?
不同的組織對(duì)安全性有不同的要求 和身份驗(yàn)證。保險(xiǎn)柜通過(guò)傳送多個(gè)身份驗(yàn)證來(lái)反映這一需求 方法。Spring Vault 支持多種身份驗(yàn)證機(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)自 .? |
有關(guān)在組件和其他屬性源中引用屬性的示例.java請(qǐng)參閱 SecurePropertyUsage。
令牌是保管庫(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)證后端保管庫(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)志。? |
基于 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)志。? |
標(biāo)簽: 身份驗(yàn)證 應(yīng)用程序 詳細(xì)信息