0

我需要避免将纯文本密码存储在配置文件中,因此我将 Postgres 密码存储在外部(在 AWS Secrets Manager 中)。

与此处提供的解决方案类似: 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 中,这违背了密码作为秘密的目的。

关于进化如何从函数中获取数据库凭据的任何建议?

4

1 回答 1

0

我遇到了同样的问题,我设法像这样解决它:

  1. 创建自定义应用程序加载器,如下所示:https ://www.playframework.com/documentation/2.7.x/ScalaDependencyInjection#Advanced:-Extending-the-GuiceApplicationLoader

  2. 在自定义加载器的构建器中,附加 Slick 的 DB 配置参数:

    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。更多细节在这里:https ://www.playframework.com/documentation/2.7.x/GlobalSettings

于 2019-09-06T15:21:39.170 回答