2012-05-09 4 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)?password。ユニットテストを実行しており、コレクションが定義されていない場合に備えています。 – 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
User.collection.findOne(_id:id).password 
0

は、私もこの問題に苦労 - ここにあります私の解決策:

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

より効率的な方法がある場合は私に知らせてください。

関連する問題