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. ;)
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é. –
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 –