在光滑上保存加密字段

时间:2013-01-28 10:35:32

标签: scala slick

一个我无法弄清楚的简单问题(谷歌或文档中没有 - 可能是显而易见的,但对我来说不是)。我正在玩Play!框架2.1和我想在数据库中保存一些敏感的用户信息。我想在每次要保存时(以及在内存中,在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时对其进行解密。现在我最好的猜测是更改oauthToken的getter和setter,但据我所知,我们不能在Scala中真正做到这一点(更不用说对Slick的影响了)。

如何在现场加密/解密?

先谢谢。

1 个答案:

答案 0 :(得分: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 */))