Play + Slick + HikariCP应用程序中的加密数据库密码

时间:2015-09-03 21:06:15

标签: database playframework slick hikaricp

我使用play-slick_2.11-1.0.1 + HikariCP 2.4.1在基于Play4的应用程序中访问SqlServer。
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"
  }
}

问题是此处配置的数据库密码必须根据我们公司的政策进行加密。

如何注入解密代码以解密连接密码?

2 个答案:

答案 0 :(得分:2)

刚刚找到解决方案:

  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)
  }

答案 1 :(得分:0)

我也在尝试最新版本2.7和光滑的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库进行加密,以完全覆盖默认代码