User
SpringSecurityコアプラグインを介して作成されたドメインエンティティにGraisでパスワード検証を実装しようとしています。エンティティに次のコードを追加しました。
class User {
// Added by the spring security core plugin
String password
// Added by me
String passwordConfirm
static constraints = {
passwordConfirm blank:false, validator: { val, obj ->
if (!obj.password.equals(obj.passwordConfirm)) {
return "user.password.confirmation.error"
}
}
}
// other methods...
}
password
が一致しない場合、バリデーターは期待どおりに機能しpasswordConfirm
ます。ただし、バリデーターが正常に渡され、インスタンスが永続化されようとしている場合、次の例外が発生します。
org.hibernate.AssertionFailure: null id in com.test.User entry (don't flush the Session after an exception occurs)
at com.shopify.RegistrationController$_closure2.doCall(RegistrationController.groovy:14)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:680)
を使用してエンティティを永続化していますuser.save(flush: true)
。
検証を削除すると、インスタンスはデータベースに正常に永続化されるため、バリデーターに何か問題があるはずだと思います。何が悪いのかについて何か提案はありますか?Grailsバージョン2.0.4を使用しています。
編集:私が私のエンティティを保存する部分は次のとおりです:
def register = {
def user = new User(params)
if (!user.save(flush:true, failOnError:true)) {
render view: 'register', model: [userInstance: user]
} else {
render view: 'success'
}
}
編集:さて、私は春のセキュリティコアによって挿入された次のコードをコメントアウトすることによってこの仕事をすることができました:
def beforeInsert() {
// encodePassword()
}
def beforeUpdate() {
// if (isDirty('password')) {
// encodePassword()
// }
}
現時点では、なぜこれが発生するのかわかりませんが、これを確認します。それまでの間、誰かがこれについて何か情報を持っているなら、私はそれを私と共有することに本当に興味があります。
編集:この関連するバグレポートを見つけました:http://jira.grails.org/browse/GRAILS-9083