Пароль зашифрованной базы данных в приложении Play + Slick + HikariCP

Я использую play-slick_2.11-1.0.1 + HikariCP 2.4.1 для доступа к SqlServer в моем приложении на основе Play4.
Подключение к базе данных в application.conf:

slick.dbs.myDatabase = {
  driver="com.typesafe.slick.driver.ms.SQLServerDriver$"
  db{
    url = "jdbc:sqlserver://sqlserverhost"
    driver = com.microsoft.sqlserver.jdbc.SQLServerDriver
    user = "admin"
    password = "ENCRYPTED_PASSWORD"
  }
}

Проблема в том, что настроенный здесь пароль базы данных должен быть зашифрован в соответствии с политикой нашей компании.

Как я могу ввести свой код расшифровки, чтобы расшифровать пароль для подключения?

1 ответ

Решение

Только что нашел решение:

  def createDecryptedDbConfig (dbConfigProvider: DatabaseConfigProvider) : DatabaseConfig[JdbcProfile] = {
    val dbConfig = dbConfigProvider.get[JdbcProfile]
    val decryptedConfig = dbConfig.config.
      withValue("db.user", ConfigValueFactory.fromAnyRef(decrypt(dbConfig.config.getConfig("db").getString("user")))).
      withValue("db.password", ConfigValueFactory.fromAnyRef(decrypt(dbConfig.config.getConfig("db").getString("password"))))
    DatabaseConfig.forConfig[JdbcProfile]("", decryptedConfig)
  }

Я также пробовал с последней игрой 2.7 с slick 3.5

package models

import com.typesafe.config.ConfigValueFactory
import javax.inject.Inject
import play.api.Logger
import play.api.db.slick.DatabaseConfigProvider
import services.EncryptDecryptService
import slick.basic.{BasicProfile, DatabaseConfig}
import slick.jdbc.JdbcProfile

trait HasDatabaseConfigTalachitas[P <: BasicProfile] {
  /** The Slick database configuration. */
  var dbConfig: DatabaseConfig[P] // field is declared as a val because we want a stable identifier.
  /** The Slick profile extracted from `dbConfig`. */
  protected final lazy val profile: P = dbConfig.profile // field is lazy to avoid early initializer problems.
  @deprecated("Use `profile` instead of `driver`", "2.1")
  protected final lazy val driver: P = dbConfig.profile // field is lazy to avoid early initializer problems.
  /** The Slick database extracted from `dbConfig`. */
  protected final def db: P#Backend#Database = dbConfig.db
}

trait HasDatabaseConfigProviderTalachitas[P <: BasicProfile] extends HasDatabaseConfigTalachitas[P] {
  /** The provider of a Slick `DatabaseConfig` instance.*/
  protected val dbConfigProvider: DatabaseConfigProvider
  override var dbConfig: DatabaseConfig[P] = dbConfigProvider.get[P] // field is lazy to avoid early initializer problems.
}

import play.api.Configuration

class CustomizedSlickConfig @Inject()(config: Configuration,
                                      encryptDecryptService: EncryptDecryptService) {

  val logger: Logger = Logger(this.getClass())

  def createDbConfigCustomized (dbConfigProvider: DatabaseConfigProvider) : DatabaseConfig[JdbcProfile] = {

    val user: String = encryptDecryptService.decrypt(config.get[String]("slick.dbs.default.db.user"))
    val pass: String = encryptDecryptService.decrypt(config.get[String]("slick.dbs.default.db.password"))

    val dbConfigOwn = dbConfigProvider.get[JdbcProfile]
    val decryptedConfig = dbConfigOwn.config
      .withValue("db.user", ConfigValueFactory.fromAnyRef(user))
      .withValue("db.password", ConfigValueFactory.fromAnyRef(pass))

    DatabaseConfig.forConfig[JdbcProfile]("", decryptedConfig)

  }
}

и это:


class Reservations @Inject()(val dbConfigProvider: DatabaseConfigProvider,
                             config: Configuration,
                             customizedSlickConfig: CustomizedSlickConfig)
  extends HasDatabaseConfigProviderTalachitas[JdbcProfile] {

  val logger: Logger = Logger(this.getClass())

  this.dbConfig = customizedSlickConfig.createDbConfigCustomized(dbConfigProvider)

необходимо полностью переопределить этот стандарт по умолчанию, используя некоторую https://github.com/google/tink библиотеку для шифрования

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