Tutos & Astuces

Migration Symfony 1.4 2 : les comptes utilisateurs et les passwords

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 Si vous souhaitez migrer les...

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

Si vous souhaitez migrer les comptes utilisateurs stockés sur un site Symfony1.4 vers Symfony2, vous allez être confrontés à un souci de compatibilité au niveau de l’encodage des mots de passe.

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 ! 😉

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0