Пароль зашифрованной базы данных в приложении 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 библиотеку для шифрования