Cette méthode à été appliquée avec FOSUserBundle, mais l’encoder, étant un built-in de Symfony2, il ne devrait pas avoir de problème pour les autres bundles.
Introduction
En effet, Symfony1.4, avec sfGuardUser, encode les mots de passe de cette façon : (source)
<?php sha1($salt.$password) /* sha1 ou une autre fonction */ ?>
Tandis que son grand frère lui, préfère le faire comme ça : (source)
<?php sha1($password.'{'.$salt.'}') ?>
De cette façon, vous aurez beau configurer le fichier security.yml afin de préciser la même fonction d’encodage, cela ne changera rien ! 😀
Pour pallier à ce problème et utiliser le même encodage, nous allons donc créer notre propre classe Encoder.
Création de la classe Encoder
Commençons donc par créer un encodeur que l’on nommera Symfony1Encoder et que nous placerons dans Security/Encoder de notre UserBundle :
// My/UserBundle/Security/Encoder <?php namespace My\UserBundle\Security\Encoder; use Symfony\Component\Security\Core\Encoder\BasePasswordEncoder; /** * Symfony1Encoder * * @author Sullivan SENECHAL <soullivaneuh@gmail.com> */ class Symfony1Encoder extends BasePasswordEncoder { public function encodePassword($raw, $salt) { return sha1($salt.$raw); } public function isPasswordValid($encoded, $raw, $salt) { return $this->comparePasswords($encoded, $this->encodePassword($raw, $salt)); } } ?>
Et ensuite déclarons le en tant que service :
<!-- My/UserBundle/Resources/config/services.xml --> <parameters> <parameter key="my_user.symfony1_encoder.class">my\UserBundle\Security\Encoder\Symfony1Encoder</parameter> </parameters> <services> <service id="my_user.symfony1_encoder" class="%my_user.symfony1_encoder.class%" /> </services>
Une fois notre service créé nous devons l’attacher à notre classe User dans security.yml :
# app/config/security.yml security: encoders: FOS\UserBundle\Model\UserInterface: id: my_user.symfony1_encoder
Merci à abuzed du Site du Zéro pour m’avoir mis sur la piste.
Conclusion
Videz le cache, et essayez de vous connecter avec votre ancien compte, ça marche ! Enfin ça devrait ! 😛
J’espère que cette astuce vous a bien aidée, si vous avez des questions n’hésitez pas ! 😉