В моей интеграции Vault и Consul у меня есть следующие секретные механизмы enble
[root@user ConsulSetup]# vault secrets list -detailed
Path Plugin Accessor Default TTL Max TTL Force No Cache Replication Seal Wrap Options Description
---- ------ -------- ----------- ------- -------------- ----------- --------- ------- -----------
cubbyhole/ cubbyhole cubbyhole_f6352b88 n/a n/a false local false map[] per-token private secret storage
identity/ identity identity_9ba1824c system system false replicated false map[] identity store
kv/ kv kv_864b2492 system system false replicated false map[version:2] n/a
sys/ system system_0064db30 n/a n/a false replicated false map[] system endpoints used for control, policy and debugging
После этого я добавил ключ / значение из этой команды
vault kv put kv/demo/dev spring.datasource.username=demo-user-dev spring.datasource.password=demo-pass-dev
Теперь я хочу прочитать эти значениячерез приложение SpringBoot, вот мой файл bootstrap.yml
spring:
cloud:
# Configuration for a vault server running in dev mode
vault:
scheme: http
host: <HOSTIP>
port: 8200
connection-timeout: 5000
read-timeout: 15000
authentication: TOKEN
token: <TOKEN>
kv.enabled: true
generic:
enabled: true
backend: kv
profile-separator: '/'
logging:
level:
ROOT: WARN
Теперь я пытаюсь запустить код
package com.example.demo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.sql.SQLException;
import static org.springframework.util.Assert.isTrue;
@SpringBootApplication
public class DemoApplication {
@Value("${spring.profiles.active:#{null}}")
private String profiles;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${other.username}")
private String other;
@Autowired
private DataSource dataSource;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@PostConstruct
private void postConstruct() throws SQLException {
System.out.println("##########################");
System.out.println("profile(s): " + profiles);
System.out.println("username: " + username);
System.out.println("password: " + password);
System.out.println("other: " + other);
dataSource.getConnection();
System.out.println("Successfully connected to database");
System.out.println("##########################");
isTrue (!username.equals("to-be-overwritten-by-vault-value"), "Username " + username);
isTrue (!password.equals("to-be-overwritten-by-vault-value"), "Password " + password);
}
}
, который заканчивается следующей ошибкой
#################### profile (s): null username: пароль для перезаписи по значению хранилища:
для перезаписи по-valult-value other: to-be-over-over-by-vault-value Успешно подключен к базе данных
#################### 2019-05-30 15: 31: 39.147 WARN 18680 --- [main] scaAnnotationConfigApplicationContext: Обнаружено исключение
во время инициализации контекста - отмена попытки обновления: org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'demoApplication': вызов метода initне удалось;вложенное исключение: java.lang.IllegalArgumentException: имя пользователя, которое будет перезаписано значением хранилища 2019-05-30 15: 31: 39.178 ОШИБКА 18680 --- [main] osboot.SpringApplication
: сбой запуска приложения
org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'demoApplication': сбой вызова метода init;вложенное исключение - java.lang.IllegalArgumentException: имя пользователя, которое будет перезаписано значением хранилища в org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization (InitDestroyAnostcessan.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization (AbstractAutowireCapableBeanFactory.java:40. Bean.Eng..RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1620) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9rabera или.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:555) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в орг.AbstractAutowireCapableBeanFactory.java:483) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject (AbstractBeanFactory ~j:30)spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:230) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean (AbstractBeanFactory.java:302) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE]в org.springframework.beans.factory.support.AbstractBeanFactory.getBean (AbstractBeanFactory.java:197) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons (DefaultListableBeanFactory.java:761) ~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.context.support.AbstractApplicationConitialFacton (AbstractApplicationContext.java:867) ~ [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:543) ~ [spring-context-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в org.springframework.boot.SpringApplication.refresh (SpringApplication.java:693) [spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:360) [spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] вorg.springframework.boot.SpringApplication.run (SpringApplication.java:303)
[spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в
org.springframework.boot.SpringApplication.run (SpringApplication.java:1118)
[spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в
org.springframework.boot.SpringApplication.run (SpringApplication.java:1107)
[spring-boot-1.5.4.RELEASE.jar: 1.5.4.RELEASE] в
com.example.demo.DemoApplication.main (DemoApplication.java:33)
[classes /: na] Причина: java.lang.IllegalArgumentException: имя пользователя
быть перезаписанным значением хранилища в
org.springframework.util.Assert.isTrue (Assert.java:92)
~ [spring-core-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в
com.example.demo.DemoApplication.postConstruct (DemoApplication.java:48)
[classes /: na] at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native
Метод) ~ [na: 1.8.0_171] в
sun.reflect.NativeMethodAccessorImpl.invoke (неизвестный источник)
~ [na: 1.8.0_171] в
sun.reflect.DelegatingMethodAccessorImpl.invoke (неизвестный источник)
~ [na: 1.8.0_171] на java.lang.reflect.Method.invoke (неизвестный источник)
~ [na: 1.8.0_171] в
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor $ LifecycleElement.invoke (InitDestroyAnnotationBeanPostProcessor.java:366)
~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor $ LifecycleMetadata.invokeInitMethods (InitDestroyAnnotationBeanPostProcessor.java:311)
~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] в
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.postProcessBeforeInitialization (InitDestroyAnnotationBeanPostProcessor.java:134)
~ [spring-beans-4.3.9.RELEASE.jar: 4.3.9.RELEASE] ... 17 общих кадров
опущен * * тысячу двадцать-один
Когда у меня есть хранилище, интегрированное с файловой системой, путь времени был примерно таким: secret\key
, он работал нормально с этими новыми изменениями и перестал работать.