需要提供数据库密码才能在运行时运行演变-Play + Slick

时间:2019-01-24 00:32:10

标签: database playframework slick hikaricp playframework-evolutions

我需要避免将纯文本密码存储在配置文件中,因此我将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中,这违反了密码作为秘密的目的。

关于如何从功能中获取数据库凭证的任何建议?

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,并且设法解决了这个问题:

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

  2. 在自定义加载程序的构建器中,附加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