问题是提供加密某些实体属性的能力。
由于实体是groovy类并且在运行时生成,我已经合并了 getter中的加密逻辑和getter中的解密逻辑。但似乎hibernate希望Getter / Setter是对称的。 session.save()调用getter在内部设置值,因此它始终将解密的版本保存到数据库中。
这是Hibernate的默认行为吗?有办法解决这个问题吗?
答案 0 :(得分:0)
每当你想在数据库中的内容和持久实体中的内容之间进行一些修改时,执行此操作的方法是使用custom user type。我已经将它用于确保保存的字符串用空格填充的内容。它比向getter和setter添加代码要少得多,并且避免因Hibernate认为你做出更改而导致意外保存的问题。
答案 1 :(得分:0)
您需要在此处使用GORM事件。在数据库插入
之前进行加密def beforeInsert() {
if (encProperty != null) {
encProperty = customEncrypt(encProperty)
}
}
从db上读取后解密:
def afterLoad() {
if (encProperty != null)
encProperty = customDecrypt(encProperty )
}
在更新期间使用def beforeUpdate()
进行加密。
参考: http://grails.org/doc/latest/guide/GORM.html#5.5.1%20Events%20and%20Auto%20Timestamping