Ошибка "Секретный идентификатор отсутствует" при подключении к Vault с использованием облачного хранилища Spring
Я пытаюсь подключиться к Spring Vault с помощью проверки подлинности на основе ролей (проект весенней загрузки).
В соответствии с документацией, я должен иметь возможность подключаться к пружинному хранилищу только при использовании подходящего режима. Тем не менее, я получаю secrect-id пропущенное исключение при запуске приложения.
http://cloud.spring.io/spring-cloud-vault/single/spring-cloud-vault.html
Когда я передаю, а также секретный идентификатор, я могу подключиться, и свойства / значения автоматически подключаются автоматически.
Есть ли способ, которым я могу соединиться с хранилищем, используя "токен + роль / идентификатор роли" и 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>
POM:
<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);
}
}
1 ответ
Проверка подлинности AppRole в Spring Vault поддерживает два режима, но не режим извлечения:
- Режим Push, в котором вам нужно поставить
secret_id
- Аутентификация без
secret_id
просто пройдяrole_id
, Этот режим требует создания роли без необходимостиsecret_id
установивbind_secret_id=false
на создание роли
Режим Pull, как указано в документации 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);
}
Рекомендации: