2012-05-09 3 views
4

Я использую MongoDB и Spring Security Core и UI в своем приложении. Почти все работает отлично, за исключением этого бита:Grails - MongoDB и обычная проверка грязных

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

, который является частью класса домена пользователя. Я читал, что грязная проверка еще не поддерживалась плагином MongoDB. Поэтому я попытался реализовать свои функции следующим образом:

Но это не работает. Я получаю классический Cannot get property 'password' on null object.

Кто-нибудь знает, как ссылаться на экземпляр из определения класса домена? Я также открываю любую лучшую идею для реализации грязной проверки.

+0

Просмотреть последний комментарий по этому вопросу JIRA: http://jira.grails.org/browse/GPMONGODB-114?focusedCommentId=69898&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-69898 «Вам нужно будет удалить методы beforeInsert, beforeUpdate и encodePassword и зашифровать пароль, как в более ранних версиях плагина, используя springSecurityService.encodePassword() в контроллерах, службах и т. Д.» – Klemens

ответ

2

Возможно, findOne возвращает null? Пробовали ли вы:

def existing = User.collection.findOne(id:id)?.password 
if (!existing || existing != password) 
+0

Это работает. Я сделал User.collection? .findOne (id) ?. пароль, если мы выполняем единичный тест, а коллекция не определена. – Keeth

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() 
    //} 
} 
+0

Вы должны сравнивать с некодированным паролем, который я думаю. – Keeth

0

Я боролся с этим вопросом, а - вот мое решение:

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

Пожалуйста, дайте мне знать, если есть более эффективный способ.

Смежные вопросы