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

Мне нужно избегать хранения простых текстовых паролей в файлах конфигурации, поэтому я храню пароль 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, что противоречит цели секретности пароля.

Любые советы о том, как эволюции могут получить учетные данные БД из функции?


person Alex Orlov    schedule 24.01.2019    source источник


Ответы (1)


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

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

person Val Dumitrescu    schedule 06.09.2019