0

我正在尝试使用基于角色的身份验证(spring boot 项目)连接到 spring Vault。

根据文档,我应该只能使用 approle(拉模式)连接到 spring vault。但是,我在应用程序启动时收到 secrect-id 缺失异常。

http://cloud.spring.io/spring-cloud-vault/single/spring-cloud-vault.html#_approle_authentication

当我通过时,secret-id 也可以连接,并且属性/值正在正确地自动连接。

有什么方法可以使用“token + role/role-id”与保险库连接,并使用提到的信息在运行时自动为我生成 secret-id。

spring.cloud.vault:
    scheme: http
    host: <host url>
    port: 80
    token : <token>
    generic.application-name: vault/abc/pqr/test
    generic.backend: <some value>
    generic.default-context: vault/abc/pqr/test
    token: <security token>
    authentication: approle
    app-role:
      role-id: <role-id>

聚甲醛:

<dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-vault-starter-config</artifactId>
        <version>1.0.0.BUILD-SNAPSHOT</version>
    </dependency>

如果需要任何其他信息,请告诉我。

更新

@ mp911de,我按照您的建议进行了尝试,但是 spring-cloud-vault 正在选择在 bootstrap.yml 中设置的属性,而不是在“onApplicationEvent”中设置的属性,因此解决方案不起作用。我尝试通过“System.setProperty”方法设置属性,但该事件不起作用。

但是,如果我在运行方法之前在 main 中设置属性,它会按预期工作。但我需要先加载 application.properties (需要从那里选择一些配置),因此不想在那里写逻辑。

我的方法有什么问题吗?

@Component public class LoadVaultProperties implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
private RestTemplate restTemplate = new RestTemplate();

@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
    try {
        String roleId = getRoleIdForRole(event); //helper method
        String secretId = getSecretIdForRoleId(event); //helper method

        Properties properties = new Properties();

        properties.put("spring.cloud.vault.app-role.secret-id", secretId);
        properties.put("spring.cloud.vault.app-role.role-id", roleId); 

        event.getEnvironment().getPropertySources().addFirst(new PropertiesPropertySource(
                PropertySourceBootstrapConfiguration.BOOTSTRAP_PROPERTY_SOURCE_NAME, properties));          
    } catch (Exception ex) {
        throw new IllegalStateException(ex);
    }
}
4

1 回答 1

2

Spring Vault 的 AppRole 认证支持两种模式,但不支持拉取模式:

  1. 您需要提供的推送模式secret_id
  2. secret_id仅通过传递就无需 a 进行身份验证role_id。此模式需要创建角色而不需要secret_id通过设置bind_secret_id=false角色创建

Vault 文档中提到的拉取模式要求客户端了解secret_id从包装响应中获取的 ,。Spring Vault 不获取包装secret_id,但我认为这将是一个不错的增强。

更新:在应用程序启动之前设置系统属性:

@SpringBootApplication
public class MyApplication {

    public static void main(String[] args) {

        System.setProperty("spring.cloud.vault.app-role.role-id", "…");
        System.setProperty("spring.cloud.vault.app-role.secret-id", "…");

        SpringApplication.run(MyApplication.class, args);
}

参考:

于 2017-08-31T14:14:46.293 回答