Я не знаю, следует ли вызывать beforeUpdate
при обновлении переходных полей, но, учитывая выбор между
- , это ошибка Grails / Hibernate
- этоожидаемое поведение, потому что при изменении временных полей обновления БД не происходили бы
Я бы поставил много денег на 2 и очень мало на 1.
Так что оставив это в стороне, яЯ думаю, что вы сделали свой домен более сложным, чем нужно.В частности, вы должны быть в состоянии достичь своей цели с помощью 2 полей пароля вместо 3.
class User {
static transients = ['passwordConfirm']
def springSecurityService
String password
String passwordConfirm
static constraints = {
password blank: false, validator: {password, self ->
// We only need to check the password confirmation when it is not empty, i.e.
// when a user registers or resets their password
if (self.passwordConfirm) {
password == self.passwordConfirm
}
}
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
private void encodePassword() {
password = springSecurityService.encodePassword(password)
passwordConfirm = springSecurityService.encodePassword(passwordConfirm)
}
}
Ваше действие контроллера сброса пароля должно выглядеть следующим образом:
def resetPassword = {
User user = User.findByUsername(params.username)
user.password = params.formPassword
user.passwordConfirm = params.formPasswordConfirm
if (user.save()) {
// It worked, send them to the login page or whatever...
} else {
// Validation failed, send them back to the reset password page
}
}