У меня есть приложение Spring Boot, в файле свойств которого есть зашифрованные значения, например. spring.security.user.password=ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm)
Я использую jasypt, чтобы расшифровывать их на лету. Это отлично работает локально.
Однако, когда я развертываю приложение в Cloud Foundry, мой файл свойств теперь извлекает значение из переменных vcap env. например spring.security.user.password=${vcap.services.myconfig.credentials.user.password}
в PCF значение добавляется как
user.password = ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm)
Однако теперь мое приложение не запускается, и я получаю сообщение об ошибке
ОШИБКА 22 --- [основная] o.s.b.web.embedded.tomcat.TomcatStarter: Ошибка при запуске контекста Tomcat. Исключение: org.springframework.beans.factory.UnsatisfiedDependencyException. Сообщение: Ошибка создания bean-компонента с именем securityFilterChainRegistration, определенным в ресурсе пути к классу [org / springframework / boot / autoconfigure / security / servlet / SecurityFilterAutoConfiguration.class]: неудовлетворенная зависимость, выраженная через параметр 0 метода securityFilterChainRegistration; вложенное исключение - org.springframework.boot.context.properties.ConfigurationPropertiesBindException: ошибка при создании bean-компонента с именем «spring.security-org.springframework.boot.autoconfigure.security.SecurityProperties»: не удалось привязать свойства к «SecurityProperties»: prefix = spring .security, ignoreInvalidFields = false, ignoreUnknownFields = true; вложенное исключение - org.springframework.boot.context.properties.bind.BindException: не удалось привязать свойства в 'spring.security.user.password' к java.lang.String
Есть ли причина, по которой мне не хватает, почему это работает локально, но не в Cloud Foundry?
ОБНОВИТЬ
cf env returns ...
System-Provided:
{
"VCAP_SERVICES": {
"user-provided": [
{
"binding_name": null,
"credentials": {
"JAVA_OPTS": "-Dspring.security.user.password=ENC\\\\(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm\\\\)",
"user.password": "ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm)"
},
"instance_name": "myconfig",
"label": "user-provided",
"name": "myconfig",
"syslog_drain_url": "",
"tags": [],
"volume_mounts": []
}
]
}
}
где это засевает версию JAVA_OPTS, которая работает, а также свойство user.password, которое не разрешает
user.password
в CF? Вы пользуетесь услугами, предоставляемыми пользователями? Если да, то как вы это создаете и можете ли вы включить очищенную версиюcf env
для своего приложения? - person Daniel Mikusa   schedule 16.03.2021.
в имени ключа и как это сглаживается. Я бы посоветовал вам попробовать пару вещей. 1.) удалите точку, поэтому используйте что-то вродеuserPassword
и посмотрите, сработает ли это, поэтому${vcap.services.myconfig.credentials.userPassword}
, а также попробуйте просто подключить${vcap.services.myconfig.credentials.userPassword}
к чему-нибудь в вашем приложении, которое просто будет регистрировать полученное значение. Если вы видите значение, это может дать некоторые подсказки, почему он не может связываться. - person Daniel Mikusa   schedule 17.03.2021${vcap.services.service-name.credentials.<key>}
, однако см. stackoverflow.com/a/52235792/1585136. Вы также можете посмотреть github.com/pivotal-cf/java-cfenv, в котором есть более надежный способ извлечения значений из связанных сервисов. - person Daniel Mikusa   schedule 17.03.2021