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