我需要避免将纯文本密码存储在配置文件中,因此我将Postgres密码存储在外部(在AWS Secrets Manager中)。
类似于此处提供的解决方案: Encrypted database password in Play + Slick + HikariCP application,我已经能够覆盖dbConfig并为这样的DAO类提供密码:
trait MyDaoSlick extends MyTableDefinitions with HasDatabaseConfig[MyPostgresDriver] {
protected val dbConfigProvider: DatabaseConfigProvider
override protected val dbConfig: DatabaseConfig[MyPostgresDriver] = secretDbConfig(dbConfigProvider)
def secretDbConfig(dbConfigProvider: DatabaseConfigProvider): DatabaseConfig[MyPostgresDriver] = {
DatabaseConfig.forConfig[MyPostgresDriver]("", dbConfigProvider.get[MyPostgresDriver].config
.withValue("db.user", ConfigValueFactory.fromAnyRef(getUN))
.withValue("db.password", ConfigValueFactory.fromAnyRef(getPWD)))
}
}
这对于常规的数据库查询非常有用,但是进化绕过了这一点,仍然希望用户名和密码位于application.conf中,这违反了密码作为秘密的目的。
关于如何从功能中获取数据库凭证的任何建议?
答案 0 :(得分:0)
我遇到了同样的问题,并且设法解决了这个问题:
创建一个自定义应用程序加载器,如下所示:https://www.playframework.com/documentation/2.7.x/ScalaDependencyInjection#Advanced:-Extending-the-GuiceApplicationLoader
在自定义加载程序的构建器中,附加Slick的数据库配置参数:
val extra = Seq(
"slick.dbs.default.db.url" -> secrets.url,
"slick.dbs.default.db.user" -> secrets.user,
"slick.dbs.default.db.password" -> secrets.pass
)
其他什么都不需要更改,因为您基本上已经添加了所有Slick所需的配置,包括其演变。
在旧版的Play上,我们曾经在GlobalSettings.onLoadConfig
内执行此操作,但在某些时候,已弃用了DI,以支持DI。此处有更多详细信息:https://www.playframework.com/documentation/2.7.x/GlobalSettings