我在我的应用程序上使用MongoDB和Spring Security Core和UI。 除了这一点,几乎所有东西都完美无缺:
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
是User域类的一部分。我已经读过MongoDB插件不支持脏检查。所以我试着像这样实现自己:
if ( User.collection.findOne(id:id).password != password ) {
encodePassword()
}
但它不起作用。我得到了经典的Cannot get property 'password' on null object.
有没有人知道如何从域类定义中引用实例? 我也愿意更好地实现脏检查。
答案 0 :(得分:2)
也许findOne返回null?你试过了吗?
def existing = User.collection.findOne(id:id)?.password
if ( !existing || existing != password )
答案 1 :(得分:0)
我刚刚遇到同样的问题,直到动态方法工作,这将不得不这样做:
def mongo
def beforeUpdate() {
def persisted = mongo.getDB("test").user.findOne(id).password
def encodedNew = springSecurityService.encodePassword(password)
if(persisted != encodedNew) password = encodedNew
//if (isDirty('password')) {
// encodePassword()
//}
}
答案 2 :(得分:0)
User.collection.findOne(_id:id).password
答案 3 :(得分:0)
我也在努力解决这个问题 - 这是我的解决方案:
def beforeUpdate() {
User.withNewSession {
def user = User.findByUsername(this.username)
if ( !user?.password || user?.password != password) {
encodePassword()
}
}
}
如果有更有效的方式,请告诉我。