Я пытаюсь получить доступ к секретам движка Cubbyhole путем динамического создания токена с ограничением использования, политикой и временем жизни. Однако я получаю исключение:
org.springframework.vault.authentication.VaultLoginException: невозможно войти в систему с помощью Cubbyhole: произошла 1 ошибка: *пропущенный путь Вот секрет в моем хранилище:

Ниже приведен код. Любая помощь приветствуется.
Конфигурация
@Configuration публичный класс VaultConfig расширяет AbstractVaultConfiguration { общедоступная статическая VaultEndpoint vaultEndpoint; частные статические RestOperations restOperations; частный статический VaultTemplate vaultTemplate; @EventListener(ApplicationReadyEvent.class) общественная недействительная инициализация () { VaultConfig.restOperations = restOperations(); VaultConfig.vaultEndpoint = vaultEndpoint(); VaultConfig.vaultTemplate = vaultTemplate(); } @Override общественный VaultEndpoint vaultEndpoint() { VaultEndpoint vaultEndpoint = VaultEndpoint.create("localhost", 8200); vaultEndpoint.setScheme("http"); вернуть хранилищеEndpoint; } @Override общественная ClientAuthentication clientAuthentication () { вернуть новый TokenAuthentication("mytoken"); } public static CubbyholeAuthentication getCubbyholeAuthentication() { List policy = Arrays.asList("default", "cubbyhole-policy"); TokenRequest VaultTokenRequest = VaultTokenRequest.builder() .ttl(120, Единица Времени. МИНУТЫ) .numUses(2) .policies(политики) .возобновляемый(ложь) .строить(); VaultTokenResponse vaultTokenResponse = VaultConfig.vaultTemplate.opsForToken().create(tokenRequest); Опции CubbyholeAuthenticationOptions = CubbyholeAuthenticationOptions.builder() .initialToken(vaultTokenResponse.getToken()) .path("секреты/") .строить(); вернуть новый CubbyholeAuthentication(options, VaultConfig.restOperations); } } Сервис
@Service общественный класс CubbyHoleService { @EventListener(ApplicationReadyEvent.class) общественный недействительный cubbyHoleTest () { VaultTemplate vaultTemplate = новый VaultTemplate(VaultConfig.vaultEndpoint, VaultConfig.getCubbyholeAuthentication()); VaultKeyValueOperations vaultKeyValueOperations = vaultTemplate.opsForKeyValue("cubbyhole/", KV_2); VaultResponseSupport responseSupport = vaultKeyValueOperations.get("my_confidential", Secrets.class); если (responseSupport == null) { System.out.println("Данные CubbyHole не найдены"); возвращаться; } System.out.println("Обнаружены данные CubbyHole"); Секреты secrets = responseSupport.getData(); System.out.println(secrets.toString()); } } Секреты POJO
@Data @AllArgsConstructor @NoArgsConstructor Секреты публичного класса { частный строковый ключ; частное строковое значение; } Полная трассировка стека
org.springframework.vault.authentication.VaultLoginException: невозможно войти в систему с помощью Cubbyhole: Произошла 1 ошибка: *пропущенный путь в org.springframework.vault.authentication.VaultLoginException.create(VaultLoginException.java:61) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.authentication.CubbyholeAuthentication.lookupToken(CubbyholeAuthentication.java:218) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.authentication.CubbyholeAuthentication.login(CubbyholeAuthentication.java:185) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.authentication.SimpleSessionManager.getSessionToken(SimpleSessionManager.java:61) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultTemplate.lambda$getSessionInterceptor$1(VaultTemplate.java:253) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:87) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.client.RestTemplateBuilder.lambda$createTemplate$4(RestTemplateBuilder.java:239) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:87) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.client.VaultClients.lambda$createRestTemplate$0(VaultClients.java:117) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:87) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:71) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:862) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.execute(RestTemplate.java:764) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:675) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.core.VaultKeyValueAccessor.lambda$doRead$1(VaultKeyValueAccessor.java:133) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValueAccessor.lambda$doRead$2(VaultKeyValueAccessor.java:166) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultTemplate.doWithSession(VaultTemplate.java:448) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValueAccessor.doRead(VaultKeyValueAccessor.java:163) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValueAccessor.doRead(VaultKeyValueAccessor.java:132) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValueAccessor.doRead(VaultKeyValueAccessor.java:107) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValue2Template.get(VaultKeyValue2Template.java:80) ~[spring-vault-core-3.0.2.jar:3.0.2] в com.samim.SpringVaultPrac.service.CubbyHoleService.cubbyHoleTest(CubbyHoleService.java:21) ~[classes/:na] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~[na:na] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] в java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] в java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] в org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:348) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:233) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:165) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:174) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145) ~[весна-контекст-6.0.13.jar:6.0.13] в org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:445) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80) ~[spring-boot-3.1.5.jar:3.1.5] в java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] в org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.5.jar:3.1.5] в com.samim.SpringVaultPrac.SpringVaultPracApplication.main(SpringVaultPracApplication.java:10) ~[classes/:na] Вызвано: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Внутренняя ошибка сервера: "{"errors":["Произошла 1 ошибка:\n\t* отсутствует путь\n\n"]}" в org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:102) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:137) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:915) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:864) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.execute(RestTemplate.java:764) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:646) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.authentication.CubbyholeAuthentication.lookupToken(CubbyholeAuthentication.java:210) ~[spring-vault-core-3.0.2.jar:3.0.2] ... 44 общих кадра опущены ОБНОВЛЕНИЕ 1:
Я изменил конфигурацию на следующую:
public static CubbyholeAuthentication getCubbyholeAuthentication() { List policy = Arrays.asList("default", "cubbyhole-policy"); TokenRequest VaultTokenRequest = VaultTokenRequest.builder() .ttl(120, TimeUnit.MINUTES).numUses(100).policies(policy).renewable(true) .строить(); VaultTokenResponse vaultTokenResponse = VaultConfig.vaultTemplate.opsForToken().create(tokenRequest); Опции CubbyholeAuthenticationOptions = CubbyholeAuthenticationOptions.builder() .initialToken(vaultTokenResponse.getToken()) .path("кубик/").build(); вернуть новый CubbyholeAuthentication(options, VaultConfig.restOperations); } И реализация службы для операции записи, как показано ниже:
@Service общественный класс CubbyHoleService { @EventListener(ApplicationReadyEvent.class) общественный недействительный cubbyHoleWrite () { Строка uuid = UUID.randomUUID().toString(); VaultTemplate vaultTemplate = getVaultTemplate(); VaultKeyValueOperations vaultKeyValueOperations = vaultTemplate.opsForKeyValue("cubbyhole/", KV_2); vaultKeyValueOperations.put(uuid, новые секреты("john_cubby", "wick_value"); System.out.println("сохранено"); } частный VaultTemplate getVaultTemplate() { вернуть новый шаблон VaultTemplate(VaultConfig.vaultEndpoint, VaultConfig.getCubbyholeAuthentication()); } } Я получаю исключение как «отсутствующий путь». Ниже приведена трассировка стека:
org.springframework.vault.authentication.VaultLoginException: невозможно войти в систему с помощью Cubbyhole: Произошла 1 ошибка: *пропущенный путь в org.springframework.vault.authentication.VaultLoginException.create(VaultLoginException.java:61) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.authentication.CubbyholeAuthentication.lookupToken(CubbyholeAuthentication.java:218) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.authentication.CubbyholeAuthentication.login(CubbyholeAuthentication.java:185) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.authentication.SimpleSessionManager.getSessionToken(SimpleSessionManager.java:61) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultTemplate.lambda$getSessionInterceptor$1(VaultTemplate.java:253) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:87) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.client.RestTemplateBuilder.lambda$createTemplate$4(RestTemplateBuilder.java:239) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:87) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.client.VaultClients.lambda$createRestTemplate$0(VaultClients.java:117) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.http.client.InterceptingClientHttpRequest$InterceptingRequestExecution.execute(InterceptingClientHttpRequest.java:87) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:71) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:862) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.execute(RestTemplate.java:764) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:646) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.core.VaultKeyValueAccessor.lambda$doWrite$3(VaultKeyValueAccessor.java:193) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultTemplate.doWithSession(VaultTemplate.java:448) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValueAccessor.doWrite(VaultKeyValueAccessor.java:192) ~[spring-vault-core-3.0.2.jar:3.0.2] в org.springframework.vault.core.VaultKeyValue2Template.put(VaultKeyValue2Template.java:134) ~[spring-vault-core-3.0.2.jar:3.0.2] в com.samim.SpringVaultPrac.service.CubbyHoleService.cubbyHoleTest(CubbyHoleService.java:26) ~[classes/:na] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) ~[na:na] в java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] в java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] в java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] в org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:348) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:233) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:165) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:174) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:167) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:145) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:445) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378) ~[spring-context-6.0.13.jar:6.0.13] в org.springframework.boot.context.event.EventPublishingRunListener.ready(EventPublishingRunListener.java:109) ~[весна-загрузка-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplicationRunListeners.lambda$ready$6(SpringApplicationRunListeners.java:80) ~[spring-boot-3.1.5.jar:3.1.5] в java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na] в org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:118) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:112) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplicationRunListeners.ready(SpringApplicationRunListeners.java:80) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:335) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.1.5.jar:3.1.5] в org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.1.5.jar:3.1.5] в com.samim.SpringVaultPrac.SpringVaultPracApplication.main(SpringVaultPracApplication.java:10) ~[classes/:na] Вызвано: org.springframework.web.client.HttpServerErrorException$InternalServerError: 500 Внутренняя ошибка сервера: "{"errors":["Произошла 1 ошибка:\n\t* отсутствует путь\n\n"]}" в org.springframework.web.client.HttpServerErrorException.create(HttpServerErrorException.java:102) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:186) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:137) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:915) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:864) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.execute(RestTemplate.java:764) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:646) ~[spring-web-6.0.13.jar:6.0.13] в org.springframework.vault.authentication.CubbyholeAuthentication.lookupToken(CubbyholeAuthentication.java:210) ~[spring-vault-core-3.0.2.jar:3.0.2] ... 41 общий кадр опущен
Мобильная версия