1

beforeInsertがトリガーされず、パスワードがプレーンテキストとしてDBに保存されているように見えますが、次のようなUserドメインクラスがあります。

class User {

    String email
    String name
    String surname
    String phone
    String password

    static constraints = {
        email(blank:false, email:true, unique:true)
        name(blank:false)
        surname(blank:false)
        phone(blank:false)
        password(blank:false, password:true)
    }

    def beforeInsert = { encodePassword() }

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

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

私が間違っていることについて何か考えはありますか?

前もって感謝します!

4

2 に答える 2

2

奇妙で理由はわかりませんが、これは機能します。beforeInsert変数をメソッドに変更し、一時的なspringSecurityServiceを追加しました。

class User {

    transient springSecurityService

    String email
    String name
    String surname
    String phone
    String password

    static constraints = {
        email(blank:false, email:true, unique:true)
        name(blank:false)
        surname(blank:false)
        phone(blank:false)
        password(blank:false, password:true)
    }

    def beforeInsert() {
        encodePassword()
    }

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

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}
于 2013-01-24T01:24:15.730 に答える
2

Userクラス定義でspringSecurityServiceの宣言を見逃したようです(@gurbietaが観察したように):

transient springSecurityService

ところで、beforeUpdateメソッドにもいくつかの修正が必要です。dirtymongodb gormプラグインは、メソッドのチェックをサポートしていません。ドキュメントを参照1.1 Compatibility with GORM for Hibernateしてください。

したがって、変更する必要があります

if (isDirty('password')) {

パスワードが変更されているかどうかを確認する他の方法に。

于 2013-01-24T04:48:58.083 に答える