一个我无法弄清楚的简单问题(谷歌或文档中没有 - 可能是显而易见的,但对我来说不是)。我正在玩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的影响了)。
如何在现场加密/解密?
先谢谢。
答案 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 */))