1

一个我无法弄清楚的简单问题(谷歌或文档中没有 - 也许很明显,但对我来说不是)。我在 Play 中使用 slick!Framework 2.1,我想在数据库中保存一些敏感的用户信息。我想在每次要保存数据时加密数据(以及在内存中,当在 a 中构造时case class)并在每次需要时解密数据。数据是 OAuth access_token

这是我的(简化的)代码:

case class User(id: Option[Int] = None,
                name: String,
                email: String,
                oauthToken: Option[String] = None)

物体:

object Users extends Table[User]("User") {
  def id = column[Int]("id", O.PrimaryKey, O.AutoInc)
  def name = column[String]("name")
  def email = column[String]("email")
  def oauthToken = column[String]("oauthToken", O.Nullable)

  def * = id.? ~
          name ~
          email ~
          oauthToken.? <> (User, User.unapply _)
}

我想要做的是在oauthToken每次User构造案例类时加密。并在每次user.oauthToken调用时对其进行解密。目前我最好的猜测是更改 的 getter 和 setter oauthToken,但据我所知,在 Scala 中我们不能真正做到这一点(更不用说对 Slick 的影响了)。

我应该怎么做才能在现场进行加密/解密?

之前谢谢。

4

1 回答 1

1

像这样的东西应该可以解决问题

// get user
Users.where(_.id is Some(1)).map(decodeUser)

def decodeUser(u: User) =
  u.copy(oauthToken = u.oauthToken.map(/* do decoding */))

// store user
for{
  model <- userForm.bindFromRequest
  id <- Users(encodeUser(model)).insert
} yield id

def encodeUser(u: User) =
  u.copy(oauthToken = u.oauthToken.map(/* do encoding */))
于 2013-01-28T15:06:45.647 回答