[英]Vault UserPass authentication with Spring boot
我需要從我的 spring 啟動微服務連接到 Vault。 要獲取 vault 令牌,該服務需要通過提供用戶名和密碼登錄到 vault。 默認情況下,Spring-vault 集成不支持此行為。
我遇到了這個SO 問題並嘗試了這種方法,但它導致BeanDefinitionStoreException
,因為已經定義了名為clientAuthentication
的 bean。
后來我參考了這個例子並擴展了AbstractVaultConfiguration
。 現在我的配置層次結構如下所示:
@Configuration(proxyBeanMethods = false)
public abstract class AbstractVaultConfiguration implements ApplicationContextAware {
public abstract VaultEndpoint vaultEndpoint();
public abstract ClientAuthentication clientAuthentication();
// other methods and bean definitions
}
@Configuration
public class EnvironmentVaultConfiguration extends AbstractVaultConfiguration implements
ApplicationContextAware {
// other methods
}
public class VaultCustomConfig extends AbstractVaultConfiguration {
@Override
public VaultEndpoint vaultEndpoint() {
return VaultEndpoint.create("https://vault-dev.net", 443);
}
@Override
public ClientAuthentication clientAuthentication() {
//logic to fetch token
}
}
前兩個類由 spring-vault 提供。 我添加了最后一個並將條目放入 spring.factories:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.test.configuration.VaultCustomConfig
應用程序正在啟動,但出現 403 錯誤。 當我從自動配置中排除EnvironmentVaultConfiguration
時,出現未創建許多 bean 的異常(ex- vaultTemplate
)。 我可以聯系保險庫 API 並使用RestTemplate
獲取令牌。 挑戰在於在應用程序嘗試聯系 vault(通過 spring-vault 支持)之前設置該令牌。
我沒有覆蓋保險庫配置,而是嘗試設置一個名為vault.token
的環境變量,該變量將在啟動期間由 spring 讀取,但這也不起作用(可能我錯過了一些東西)。
如何覆蓋內置配置並提供令牌?
Spring Vault 相關的 bean 在引導上下文期間初始化,引導上下文是主應用程序的父上下文。 這就是為什么您需要使用bootstrap.yml
而不是application.yml
來定義屬性的原因。 查看Spring Cloud Context: Application Context Services了解更多詳情。
您還需要在META-INF/spring.factories
中使用org.springframework.cloud.bootstrap.BootstrapConfiguration
。
Spring 從此屬性spring.cloud.vault.token
讀取保管庫令牌。 我創建了一個自定義PropertySourceLocator
並添加了令牌:
public class VaultCustomPropertySourceLocator implements PropertySourceLocator {
@Override
public PropertySource<?> locate(Environment environment) {
Properties props = new Properties();
props.setProperty("spring.cloud.vault.token", getVaultAuthToken());
PropertiesPropertySource ps = new PropertiesPropertySource("customPropsSource",props);
return ps;
}
private String getVaultAuthToken() {
// logic to fetch vault token
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.