簡體   English   中英

使用 Spring 啟動的 Vault UserPass 身份驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM