J'utilise Grails 2.0.0.RC2 et j'ai une classe d'utilisateur comme ceci:AvantMAJ pas appelé quand seulement transitoires a changé
class User {
String username
String password
// Idea from http://grailsrecipes.wordpress.com/2009/04/19/grails-user-registration-and-login/ .
String formPassword
String formPasswordConfirm
// Constraints and validation ommited
static transients = ['formPassword', 'formPasswordConfirm']
def beforeUpdate() {
println("Inside beforeUpdate")
if (formPassword != null)
encodePassword()
}
protected void encodePassword() {
password = formPassword // Just for this case
}
}
Lorsque l'utilisateur demande son nouveau mot de passe, je l'envoie par courriel avec un lien pour réinitialiser la page de mot de passe. Le formulaire de réinitialisation du mot de passe est simple. Il ne contient que deux champs: formPassword
et formPasswordConfirm
. Je fais une action simple dans le contrôleur: user.formPassword = params["formPassword"]
et user.formPasswordConfirm = params["formPasswordConfirm"]
. Alors je fais (user.save()
) - et le problème commence.
Mon problème est que beforeUpdate()
n'est pas appelé. Je pensais que c'était un problème de validation (c'est omis ici), mais ce n'est pas le cas. Comme il s'avère que user.save()
n'a pas persisté utilisateur à la base de données! Pourquoi? Je voulais qu'il soit persistant, le mot de passe devrait être changé. Mais user.isDirty()
est faux juste avant user.save()
. En effet, aucune propriété persistante n'a été modifiée. C'est vrai. Depuis user.save()
n'a pas été appelé - beforeUpdate()
n'a pas été appelé non plus.
Est-ce le comportement désiré? Peut-être que c'est un bug de Grails et beforeUpdate()
devrait toujours être appelé avant la mise à jour, puis isDirty()
devrait être vérifié? Qu'est-ce que tu penses?
Merci pour votre réponse. J'aime votre solution avec 2 champs de mot de passe. Il résout que beforeUpdate ne soit pas appelé aussi. Merci. –
De rien. C'est presque identique à la solution dans ma propre application (qui utilise également la sécurité de printemps), et cela fonctionne bien –
mais j'ai encore besoin de résoudre un autre problème. Après la phase de validation, comment ecnode-t-on le mot de passe stocké sur db? Dans Grails 2.0.0.RC2, beforeUpdate se produit avant la validation. –