使用Spring Cloud Starter Vault配置访问Docker Vault机密无法解决

时间:2018-04-22 23:26:50

标签: docker spring-cloud spring-cloud-vault-config spring-vault

我正在以Docker Vault container模式运行dev,而我无法读取名为/secret/mobsters/ password的秘密。

以下是Spring logs

运行vault kv get secret/mobsters会返回密码键值对。我也可以在本地访问Vault服务器。

以下是我引用这个秘密的方式:

@Value("${password}")
String password;

@PostConstruct
private void postConstruct() {
    System.out.println("My password is: " + password);
}

使用Spring Cloud Vault文件设置bootstrap.yml配置:

spring.application.name: mobsters
spring.cloud.vault:
host: localhost
port: 8200
scheme: http
authentication: TOKEN
token: ...

我收到消息的异常(完全例外here):

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'password' in value "${password}"`

来自Vault UI:

enter image description here

2 个答案:

答案 0 :(得分:2)

将Spring Vault / Spring Cloud Vault与HashiCorp Vault 0.10.0一起使用不起作用,因为默认情况下启用版本控制时会挂载键/值后端。这具有一定的意义,因为版本化的API已经完全改变并且破坏了现有的客户端实现。上下文路径和响应结构是不同的。

您有两种选择:

  1. 使用较旧的Vault版本(例如0.9.5)
  2. 尝试应对API更改,直到Spring Cloud Vault找到使用新API的方法。你需要:
    • 在引导程序配置中设置@Value("${hello.world}")
    • 使用@Value("${data.hello.world}")添加属性名称,以便@pytest.fixture(scope="session", autouse=True) def before_all_tests(request): # Code that I want to run only once before all tests start to run 成为{{1}}。

答案 1 :(得分:0)

似乎有一种解决方法。

在您的bootstrap.yml中,确保generic.enabled为假,kv.enabled为真。

spring:
  ...
  cloud.vault:
      ...
      kv.enabled: true
      generic.enabled: false

根据this answer on GitHub

  

两者之间的主要区别是kv注入数据   在上下文路径中进行细分,并解开嵌套的数据响应。

     

如果您正在运行2.0之前的[springboot]版本,则需要实现一个   org.springframework.cloud.vault.config.VaultConfigurer bean是   暴露于引导上下文。 SecretBackendConfigurer接受   路径和一个PropertyTransformer,它可以先转换属性   将这些作为PropertySource公开。