4

我在我的应用程序上使用 MongoDB 和 Spring Security Core 和 UI。几乎所有的东西都完美无缺,除了这一点:

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

这是用户域类的一部分。我读过 MongoDB 插件还不支持脏检查。所以我试着像这样实现我自己的:

if ( User.collection.findOne(id:id).password != password ) {
            encodePassword()
        } 

但它不起作用。我得到了经典Cannot get property 'password' on null object.

有谁知道如何从域类定义中引用一个实例?我也愿意接受任何更好的想法来实施脏检查。

4

4 回答 4

2

也许 findOne 返回 null?你试过了吗:

def existing = User.collection.findOne(id:id)?.password 
if ( !existing || existing != password ) 
于 2012-05-09T15:59:50.527 回答
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()
    //}
}
于 2012-05-30T13:59:21.877 回答
0
User.collection.findOne(_id:id).password
于 2013-03-07T11:15:10.587 回答
0

我也为这个问题而苦苦挣扎 - 这是我的解决方案:

def beforeUpdate() {
    User.withNewSession {
        def user = User.findByUsername(this.username)
        if ( !user?.password || user?.password != password) {
            encodePassword()
        }
    }
}

请让我知道是否有更有效的方法。

于 2013-07-15T21:52:11.743 回答