问题描述
我有一个 Spring Boot 应用程序,它的属性文件中有一些加密值
例如spring.security.user.password=ENC(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm)
我正在使用 jasypt 即时解密这些。这在本地运行正常。
但是,当我在 Cloud Foundry 上部署应用程序时,我的属性文件现在从 vcap 环境变量中提取值。
例如
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]: 通过方法表达的不满足的依赖 'securityFilterChainRegistration' 参数 0;嵌套异常是 org.springframework.boot.context.properties.ConfigurationPropertiesBindException: 创建带有名称的 bean 时出错 'spring.security-org.springframework.boot.autoconfigure.security.SecurityProperties': 无法将属性绑定到“SecurityProperties”: 前缀=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 属性
解决方法
试试这个:
JAVA_OPTS=-Dspring.security.user.password=ENC\\(ZUkuSkFAiu/k7v7G1538ouQmuSWeAuOucAVuvxLCDwwJ0mgnIdfl3N/RgiZMGeBm\\)