2010-11-14 4 views
0

Dites que j'ai une classe de domaine utilisateur avec les champs username et password. Pour plus de simplicité, je voudrais stocker les mots de passe sous forme de hachage SHA-512. Je veux aussi valider le mot de passe avant de le hacher, mais aussi hacher le mot de passe de manière transparente avant de le sauvegarder. Existe-t-il un moyen de le faire dans l'objet de domaine?Grails Modification du domaine en enregistrement

static constraints = 
{ 
    username(blank: false, unique: true); 
    password(minSize: 10); 
} 

Au lieu de dire:

def user = new User(username: "joe", password: createHash("joepass")); 

où je ne peux pas valider le hachage

def user = new User(username: "joe", password: "joepass"); 
if(user.validate()) 
{ 
    user.save(); // Would then turn password into a hash on save 
} 
else 
{ 
    // Handle validation errors 
} 

Après GORM Events je suis venu avec ce qui suit:

def beforeInsert = { doHash(); } 
def beforeUpdate = { doHash(); } 
void doHash() 
{ 
    if(this.password.size() != 32) 
    { 
     this.password = this.password.encodeAsHash(); // I wrote a codec for this 
    } 
} 

Maintenant, ce travail ks bien lors de la création de nouveaux utilisateurs. Cependant, si je crée un utilisateur, lui donne un mot de passe, et les sauvegarde, puis change le mot de passe et ré-enregistre aucune de ces méthodes n'est appelée et le mot de passe simple de test est stocké.

+1

Je me demande pourquoi ne pas utiliser validateur et régleurs 'champ password' - se sent tout comme la logique de domaine. –

+0

Juste pour info, le lien est cassé. C'est maintenant http://gorm.grails.org/6.0.x/hibernate/manual/#eventsAutoTimestamping. –

Répondre

1

Utilisez le GORM Events

Sur les enregistrer ou les événements de mise à jour, vous pouvez faire le hachage créer

def beforeInsert = { 
     // do hash magic 
    } 
    def beforeUpdate = { 
     // do hash magic 
    } 
+0

Parfait! Merci beaucoup. –

+0

En fait peut-être imparfait. Je vais mettre à jour la question. –

+0

Je l'ai trouvé, j'ai dû ajouter un 'flush: true' dans l'appel' save() '. –

Questions connexes