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

问题描述 投票:2回答:2

我正在使用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"
  }
}

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

如何注入我的解密代码来解密连接密码?

database playframework slick hikaricp
2个回答
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)
  }

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库进行加密来完全覆盖该默认代码

© www.soinside.com 2019 - 2024. All rights reserved.