Необходимо указать пароль БД для запуска эволюции во время выполнения - Play + Slick

Мне нужно избегать хранения паролей в виде простого текста в файлах конфигурации, поэтому я храню пароль Postgres извне (в AWS Secrets Manager).

Аналогично предоставленному здесь решению: пароль зашифрованной базы данных в приложении Play + Slick + HikariCP, я смог переопределить 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 ответов

Я столкнулся с той же проблемой, и мне удалось ее решить следующим образом:

  1. Создайте собственный загрузчик приложений, как показано здесь: https://www.playframework.com/documentation/2.7.x/ScalaDependencyInjection

  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. Подробнее здесь: https://www.playframework.com/documentation/2.7.x/GlobalSettings

Другие вопросы по тегам