2012-03-07 4 views
2

Je voulais utiliser MongoDB dans mon application Grails et Spring Security. J'ai généré des classes User et Role avec la commande s2-quickstart. J'ai ajouté une propriété id à toutes mes classes de type ObjectId comme il est dit dans de nombreux articles de blog.Utilisation de Spring Security avec MongoDB

Il fonctionne, mais une méthode me dérange un peu:

// SecUser.groovy (generated by s2-quickstart) 
def beforeUpdate() { 
    if (this.isDirty('password')) { 
     encodePassword() 
    } 
} 

La méthode isDirty() semble être disponible dans un environnement MongoDB. Cela fonctionne bien en utilisant Hibernate. Ceci est un bug déposé sous http://jira.grails.org/browse/GPMONGODB-114

Y at-il un moyen de contourner cette méthode? Pour autant que je sache, il vérifie si le mot de passe a été modifié et l'encode à nouveau.

Ne serait-il pas possible de le faire manuellement? Par exemple, si j'ai une page Profil d'utilisateur qui a le champ de mot de passe inclus, je viens de l'encoder à nouveau sur enregistrer? Je voudrais vraiment utiliser à la fois Spring Security et MongoDB ensemble et je suis sûr que cette méthode ne m'arrêtera pas. ;)

Répondre

1

Je ne vois pas pourquoi vous ne pouvez pas créer votre propre UserDetailsService qui charge le mot de passe haché de Mongo, puis utilisez un PasswordEncoder dans votre AuthenitcationManager. Cela indiquera à Spring de hacher le mot de passe entré par l'utilisateur avant de le comparer à la valeur que vous avez récupérée de mongo.

Je ne peux pas commenter l'aspect Grails mais nous utilisons des mots de passe de sécurité Spring et hashed avec Mongo. Nous avons actuellement un encodeur de mot de passe personnalisé qui utilise un hachage/sel itératif donc je suis sûr que ce que vous voulez est possible :)

+0

A quoi sert le 'UserDetailsService'? J'ai vu cette classe dans un exemple d'application sur GitHub, mais elle n'a pas été générée. Est-ce juste une bonne chose à avoir? Je ne vois actuellement aucun avantage à l'utiliser. J'ai simplement jeté les méthodes 'before ...()' et j'ai créé un nouvel objet 'User' et j'ai défini le mot de passe salé/hashed" à la main "et non par l'objet' User' lui-même. Fonctionne comme un charme. Je suppose que beaucoup de choses sont faites automatiquement par le plugin Grails ou Spring Security lui-même qui n'a pas besoin d'être explicitement configuré. –

+0

Enfin marqué votre réponse comme correcte, puisque l'implémentation du mot de passe se hachant à chaque sauvegarde ou mise à jour de l'utilisateur est la seule façon d'aller avec Grails et MongoDB, puisque 'isDirty()' est seulement supporté dans Hibernate. Ne fait pas mal bien que –