Spring 使用 Jasypt 加密引导外部化配置(Bootstrap 问题)
Spring Boot Externalized Configuration with Jasypt encryption(Bootstrap issue)
在我的 Spring 引导应用程序中,当我尝试使用带有 Jasypt 加密密码的 uri
模式连接到 MongoDB 时,我遇到了 Auth 异常。在调试时,我确实看到使用 URI 时 Jasypt 解密没有发生,而使用单独的 mongo 配置(见下文)连接成功。在日志中,加密字符串 ENC(Qev1vJ3DummyPSUApeQfgdgfd==)
被打印出来,没有解密。整个配置使用 SPRING_APPLICATION_JSON
通过命令行传递
使用uri
:(不工作)
java -Dspring.application.json="{低于 json}" -jar myapp.jar
{
"spring": {
"data": {
"mongodb": {
"uri": "mongodb://myusername:${spring.data.mongodb.password}@localhost:27017/mydb",
"password": "${mongodb.password}"
}
}
},
"jasypt": {
"encryptor": {
"password": "myjasypt-password"
}
},
"mongodb": {
"password": "ENC(Qev1vJ3DummyPSUApeQfgdgfd==)"
}
}
With Individual property setting
:(工作正常)
java -Dspring.application.json="{低于 json}" -jar myapp.jar
{
"spring": {
"data": {
"mongodb": {
"host": "localhost",
"port": "27017",
"database": "mydb",
"username": "myusername",
"password": "${mongodb.password}"
}
}
},
"jasypt": {
"encryptor": {
"password": "myjasypt-password"
}
},
"mongodb": {
"password": "ENC(Qev1vJ3DummyPSUApeQfgdgfd==)"
}
}
Spring 开机:1.5.2.RELEASE | MongoDB:3.4.2 |贾斯普特:1.14
异常:
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName=myusername, source=mydb, password=<hidden>, mechanismProperties={}}
在 uri 中使用时,Jasypt 解密似乎没有发生。我不确定这是否与配置的引导有关。任何指针都会有所帮助。
我建议直接指定加密的属性,就像这样
{
"spring": {
"data": {
"mongodb": {
"uri": "mongodb://myusername:${mongodb.password}@localhost:27017/mydb"
}
}
},
"jasypt": {
"encryptor": {
"password": "myjasypt-password"
}
},
"mongodb": {
"password": "ENC(Qev1vJ3DummyPSUApeQfgdgfd==)"
}
}
在我的书中,这两个例子是等价的
找到答案了。这个问题似乎存在于 Jasypt 1.14 中,并在 1.17 及更高版本中得到修复。
如果无法更改 1.14 版本,请在 resources/META-INF/spring.factories
中添加以下条目
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ulisesbocchio.jasyptspringboot.JasyptSpringBootAutoConfiguration
在版本 1.17 中,Jasypt 的 EnableEncryptablePropertiesConfiguration
使用 Applicationcontextinitializer 自定义 Environment
在我的 Spring 引导应用程序中,当我尝试使用带有 Jasypt 加密密码的 uri
模式连接到 MongoDB 时,我遇到了 Auth 异常。在调试时,我确实看到使用 URI 时 Jasypt 解密没有发生,而使用单独的 mongo 配置(见下文)连接成功。在日志中,加密字符串 ENC(Qev1vJ3DummyPSUApeQfgdgfd==)
被打印出来,没有解密。整个配置使用 SPRING_APPLICATION_JSON
使用uri
:(不工作)
java -Dspring.application.json="{低于 json}" -jar myapp.jar
{
"spring": {
"data": {
"mongodb": {
"uri": "mongodb://myusername:${spring.data.mongodb.password}@localhost:27017/mydb",
"password": "${mongodb.password}"
}
}
},
"jasypt": {
"encryptor": {
"password": "myjasypt-password"
}
},
"mongodb": {
"password": "ENC(Qev1vJ3DummyPSUApeQfgdgfd==)"
}
}
With Individual property setting
:(工作正常)
java -Dspring.application.json="{低于 json}" -jar myapp.jar
{
"spring": {
"data": {
"mongodb": {
"host": "localhost",
"port": "27017",
"database": "mydb",
"username": "myusername",
"password": "${mongodb.password}"
}
}
},
"jasypt": {
"encryptor": {
"password": "myjasypt-password"
}
},
"mongodb": {
"password": "ENC(Qev1vJ3DummyPSUApeQfgdgfd==)"
}
}
Spring 开机:1.5.2.RELEASE | MongoDB:3.4.2 |贾斯普特:1.14
异常:
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName=myusername, source=mydb, password=<hidden>, mechanismProperties={}}
在 uri 中使用时,Jasypt 解密似乎没有发生。我不确定这是否与配置的引导有关。任何指针都会有所帮助。
我建议直接指定加密的属性,就像这样
{
"spring": {
"data": {
"mongodb": {
"uri": "mongodb://myusername:${mongodb.password}@localhost:27017/mydb"
}
}
},
"jasypt": {
"encryptor": {
"password": "myjasypt-password"
}
},
"mongodb": {
"password": "ENC(Qev1vJ3DummyPSUApeQfgdgfd==)"
}
}
在我的书中,这两个例子是等价的
找到答案了。这个问题似乎存在于 Jasypt 1.14 中,并在 1.17 及更高版本中得到修复。
如果无法更改 1.14 版本,请在 resources/META-INF/spring.factories
中添加以下条目org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.ulisesbocchio.jasyptspringboot.JasyptSpringBootAutoConfiguration
在版本 1.17 中,Jasypt 的 EnableEncryptablePropertiesConfiguration
使用 Applicationcontextinitializer 自定义 Environment