我的本地计算机上有一个正在运行的Spring Cloud Config客户端(Spring Boot 2.0.5应用程序)。它连接到启用了基本身份验证的Spring Cloud Config Server。一切正常,密码未在客户端的配置文件中加密。因此属性为:
spring.cloud.config.username=rxcon
spring.cloud.config.password=rxcon
现在,当我将Spring Boot移至另一台机器并对其进行配置以与另一台Spring Cloud Config Server(具有与rxcon / rxcon相同的凭据)进行对话时,我得到401未经授权的响应。因此,我认为用户名密码有问题。我们一遍又一遍地检查,它们是正确的。
因此,我增加了日志记录,并希望看到Authorization标头具有类似以下值:
Basic cnhjb246cnhjb24=
但是,实际的标题是:
Basic cnhjb246Pz91Pz8/aWY/Pz9dBD8eJA==
已解码:
rxcon:??u???if???]?$
因此,用户名正确,但是密码又是怎么回事?
注意1:我们使用tcpdump检查了标头的实际接线值,是的,这是错误的。
注意2:如果更改密码,则Auth标头的值不会更改。
注3:当我们记录属性(spring.cloud.config.password)的值时,我们看到正确的密码(rxcon)
注释4:已通过JDK 1.8、10和11测试
如果我在jar文件中嵌入了bootstrap.properties,那么这些值会被外部的bootstrap.properties覆盖吗?
答案 0 :(得分:0)
好的,我发现了问题。 Spring Boot DOES允许覆盖属性。我们有一个嵌入式的bootstrap.properties(具有(开发)默认值),并在生产中用一个外部的bootstrap.properties文件覆盖了它。但是,ENCRYPTED属性不会被纯文本属性覆盖。因此,我们在外部bootstrap.properties中有一个加密的嵌入式spring.cloud.config.password及其纯文本版本。 (我说过我们不使用加密,但是仅对外部化的配置文件适用。嵌入式文件适用!)一旦Spring Cloud Config读取了所有属性源,它就会搜索加密的属性(以{cipher}开头),将其解密并放在优先级最高的PropertySource中。因此,嵌入式加密属性有效地掩盖了未加密的外部化属性。