0

我有一个springboot使用这些版本的应用程序:

SpringBoot: 2.3.1
SpringCloud: Hoxton.SR5 
SpringData: Neumann-SR1

我已经使用了此处描述的自定义类(来自@Arun 的回答):Configuring Spring Cloud Vault Config to pull from a location than /secret

它甚至似乎都没有选择保管库配置。我有bootstrap.yml以下内容:

spring:
  cloud:
    # Vault configurations
    vault:
      generic:
        enabled: false
      uri: https://${URI}
      authentication: TOKEN
      token: ${VAULT_TOKEN}

    config:
      discovery:
        enabled: true

我正在尝试在本地提出它,所以我有application.yml以下内容:

spring:
  datasource:
    url: jdbc:postgresql://localhost:8157/postgres

这是我试图将值vault注入我的数据源的地方:

@Profile(value = {"local", "dev", "stg", "prd"})
@Configuration
public class DatabaseConfig {

  @Autowired
  DatabaseCredentials config;

  @Bean
  @Primary
  public DataSource dataSource() {

    return DataSourceBuilder
        .create()
        .username(config.getUsername())
        .url(config.getUrl())
        .password(config.getPassword())
        .driverClassName("org.postgresql.Driver")
        .build();
  }
}

当应用程序启动时,它DatabaseCredentials是空的。

我做的另一种方式是这样的:

public class DatabaseConfig {
  
  @Value("${ccm.database.username}")
  String username;

  @Value("${ccm.database.password}")
  String password;

  @Value("${spring.datasource.url}")
  String url;

  @Bean
  @Primary
  public DataSource dataSource() {
    
    return DataSourceBuilder
        .create()
        .username(username)
        .url(url)
        .password(password)
        .driverClassName("org.postgresql.Driver")
        .build();
  }
}

这也空出来了,说它找不到ccm.database.username.

我究竟做错了什么?

4

3 回答 3

0

Spring Cloud 支持从 Vault 导入标准 Spring Boot 配置。

使用两个依赖项进行自动配置:

  • org.springframework.cloud:spring-cloud-starter-vault-config

  • org.springframework.cloud:spring-cloud-vault-config-databases

请参阅: https ://medium.com/digitalfrontiers/manage-your-database-accounts-with-spring-cloud-vault-config-48cecb837a36

于 2022-02-01T09:11:55.220 回答
0

您缺少关于DatabaseConfig.java

这将是这样的。

@Component
@ConfigurationProperties("ccm.database")

所以它变成

@ConfigurationProperties("ccm.database")
@Component
public class DatabaseCredentials {
  
  @Value("${ccm.database.username}")
  String username;

  @Value("${ccm.database.password}")
  String password;

  @Value("${spring.datasource.url}")
  String url;

  // Getters and setters for all properties go here
}

访问配置

@Configuration
public class DatabaseConfig {

  @Autowired
  DatabaseCredentials config;

  @Bean
  @Primary
  public DataSource dataSource() {

    return DataSourceBuilder
        .create()
        .username(config.getUsername())
        .url(config.getUrl())
        .password(config.getPassword())
        .driverClassName("org.postgresql.Driver")
        .build();
  }
}
于 2020-07-06T22:01:23.107 回答
0

Spring Cloud Vault 为您提供调试信息,帮助我找出问题所在。我最终用kv而不是自定义VaultConfigurerbean 定义了路径。

kv:
  enabled: true
  backend: tcds/kv/app-name
  application-name: ccm

这将创建如下路径:tcds/kv/app-name/ccm/${PROFILE}.
我假设该路径下的所有秘密都将被拾取,并且我最初的路径下有多个文件夹tcds/kv/app-name/ccm/dev
例如:../ccm/dev/database, ../ccm/dev/other-creds

但是,似乎 spring Vault 并没有去嵌套路径获取秘密,而是在那里寻找一个包含所有凭据的文件。

因此,我删除了该dev 文件夹并将其替换为具有以下条目的dev 文件:

{
  "database.username": "blah",
  "database.password": "moreblah",
  "other-creds.user": "dummy"
}

我可以通过DatabaseConfig.java单独使用类而不需要使用DatabaseCredentials.java注释@ConfigurationProperties从保险库中获取凭据。

于 2020-07-07T22:06:21.387 回答