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 проблемы.
- переопределение предварительно настроенных bean-компонентов Spring.
решение: добавить
spring.main.allow-bean-definition-overriding =true
в вашем файле bootstrap.properties. это позволяет переопределить определение компонента.
- beanInstantiationException: поскольку шаги аутентификации не были определены должным образом. решение: я использовал метод аутентификации токена следующим образом:
public ClientAuthentication clientAuthentication() { return new TokenAuthentication(new UserPassAuthentication("host", path, "user", "password").login()); }
а остальная часть кода точно такая же, как показано ранее.