UserPass Authentication Vault

Я пытался использовать метод аутентификации из Hashicorp Vault ( отсюда) в моем приложении, чтобы получить конфигурации.

Но я не могу получить какую-либо информацию об этом типе аутентификации в документах, примерах и т. Д. Spring. Не могли бы вы мне помочь, так как мне нужен этот тип аутентификации, чтобы помочь мне с хранилищем в многопользовательской среде.

2 ответа

Вот мое решение:

Класс конфигурации:

package com.company.myapp.config;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.vault.VaultException;
import org.springframework.vault.authentication.ClientAuthentication;
import org.springframework.vault.support.VaultToken;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;

@Configuration
public class VaultConfig {

    public static final String LOGIN_PATH = "/v1/auth/userpass/login/";

    @Bean
    public ClientAuthentication clientAuthentication(@Value("${VAULT_USERNAME}") String username,
                                                     @Value("${VAULT_PASSWORD}") String password,
                                                     @Value("${spring.cloud.vault.uri}") String host) {
        return new UserPassAuthentication(host, LOGIN_PATH, username, password);
    }

    public static class UserPassAuthentication implements ClientAuthentication {

        private RestOperations restOperations = new RestTemplate();

        private String url;

        private String password;

        public UserPassAuthentication(String host, String path, String user, String password) {
            this.url = new StringBuilder(host).append(path).append(user).toString();
            this.password = password;
        }

      @Override
    public VaultToken login() throws VaultException {
        return VaultToken.of(
                ((Map<String, String>) restOperations.postForEntity(url, new Password(password), Map.class)
                        .getBody().get("auth")).get("client_token"));
    }
}

static class Password {
    private String password;

    public Password(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

ресурсы /bootstrap.properties:

spring.profiles.active=dev

spring.application.name=myapp
spring.cloud.vault.kv.enabled=true
spring.cloud.vault.kv.backend=test-backend

spring.cloud.vault.uri=https://localhost:8200
VAULT_USERNAME=usr
VAULT_PASSWORD=pwd

ресурсы /META-INF/spring.factories

org.springframework.cloud.bootstrap.BootstrapConfiguration=com.company.myapp.config.VaultConfig

Используя это решение, у меня было 2 проблемы.

  1. переопределение предварительно настроенных bean-компонентов Spring.

решение: добавить

spring.main.allow-bean-definition-overriding =true

в вашем файле bootstrap.properties. это позволяет переопределить определение компонента.

  1. beanInstantiationException: поскольку шаги аутентификации не были определены должным образом. решение: я использовал метод аутентификации токена следующим образом:
             public ClientAuthentication clientAuthentication()  {
         return new TokenAuthentication(new UserPassAuthentication("host", path, "user", "password").login());
     }
    

а остальная часть кода точно такая же, как показано ранее.

Другие вопросы по тегам