Я пытаюсь подключиться к хранилищу Spring, используя аутентификацию на основе ролей (проект весенней загрузки).
Согласно документации, я должен иметь возможность подключиться к пружинному хранилищу только с помощью Approle (режим pull). Однако при запуске приложения я получаю исключение отсутствия secrect-id.
http://cloud.spring.io/spring-cloud-vault/single/spring-cloud-vault.html#_approle_authentication.
Когда я передаю секретный идентификатор, я могу подключиться, и свойства / значения автоматически подключаются правильно.
Есть ли способ подключиться к хранилищу, используя «токен + роль / идентификатор роли», и Spring автоматически сгенерировать секретный идентификатор для меня во время выполнения, используя указанную информацию.
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);
}
}