Symfony 4 : Gestion utilisateurs sans FOSUserBundle v2018 : Chapitre 3

Cet article est écrit en 3 parties :

Dans ce chapitre nous allons voir comment s’enregistrer et récupérer son mot de passe lors d’un oubli.

On va commencer par l’inscription mais ça va être très simple car on va se baser sur ce que l’on a déjà fait.

Nous allons d’abord ajouter une fonction register à notre controller Security :

Pour la vue nous allons simplement copier la page login.html.twig en register.html.twig, et faire quelques modifs (changement du titre, suppression des messages d’erreur, du csrf, du remember me, etc.. l’ideal serait évidemment d’utiliser un formType) ce qui nous donne au final :

On va aussi modifier le fichier de base.html.twig pour y ajouter un lien d’inscription quand l’utilisateur n’est pas loggué :

Ensuite nous allons compléter notre fonction register qui sera assez simple car ce sera tout simplement la création d’un objet User (Il faudrait aussi ici ajouter des contrôles) :

On va faire plus compliqué en ajoutant la fonction « Mot de passe oublié », on va déjà commencer par ajouter le lien sous le formulaire de login :

Et créer la route dans le fichier Security :

On va aussi tout de suite créer la page twig (security/forgotten_password.html.twig) qui sera relativement simple puisqu’elle ne contiendra qu’un formulaire qui permettra à l’utilisateur de saisir son adresse mail :

Ainsi que la vue pour saisir le nouvel email (security/reset_password.html.twig) :

La réinitialisation du mot de passe va se passer en 2 étapes :

  • L’envoi d’un mail avec un lien cliquable
  • La saisie du nouveau mot de passe

On va donc avoir besoin d’un token qui va permettre d’identifier l’utilisateur (à ajouter dans la classe User) :

Et modifier le controller Security qui va envoyer le mail et mettre à jour la zone resetToken, pour l’envoi de mail il va nous falloir ajouter swiftmailer :

  • composer require symfony/swiftmailer-bundle

Un controller qui va envoyer le mail :

Et enfin le controller qui va demander à l’utilisateur de saisir son nouveau mail :

C’est donc terminé pour cette série, à ce niveau vous devriez être capable de mettre un système de connexion utilisateur en place, et tout ça sans utiliser FOSUserBundle !

Vous pourrez retrouver le code de l’ensemble du projet sur github : https://github.com/gponty/userDemo2018

26 commentaires

  1. Merci beaucoup pour ce tutoriel très complet, vraiment très utile quand on se remet à Symfony, qu’on s’attaque à la version 4, et qu’on connaissait que FOSUserBundle ! (ça empêche pas que j’ai du me battre un petit peu, mais ça c’était obligé, vu que j’ai voulu modifier pas mal de trucs ahah, et puis ce serait pas drôle sinon !)

    Petite coquille dans ton twig ‘register.html.twig’, tu as ‘ for= »inputEmail » ‘ dans le label du nom !

    Ah, et lorsqu’on ajoute la route ‘register’ dans le Controller, il faut penser à ajouter

    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
    use App\Entity\User;

    Encore merci, et bonne continuation ! Hâte de voir les prochains tutoriels de ce genre 😉

  2. Bonjour,

    J’ai utilisé le tuto pour implémenter la remise à 0 des mdp.

    Par contre j’ai une erreur avec $tokenGenerator argument is type-hinted with the non existant class or interface.

    J’ai l’impression que je dois utiliser un USE

    Un avis?

    1. Exactement le même problème que j’ai résolu avec

      use Symfony\Component\Security\Csrf\TokenGenerator\TokenGeneratorInterface;

      En revanche, j’ignore si cela règle le problème et créé correctement le token (pas encore essayé)

  3. Salut.

    merci pour ce super tuto qui fonctionne bien. grand merci.

    peu être un peu trop de copier/coller, devoir/corrigé, mais j’ai quand meme un soucis a résoudre.

    * @Route(« /reset_password/{token} », name= »app_reset_password »)

    ne s’affiche pas comme il faut, il faut que je creuse un peu de ce coté la.

  4. Super explications et détails dans l’organisation de ces méthodes, par contre j’ai aussi un soucis avec la route :
    *@Route(« /reinitialiser-mot-de-passe/{token} », name= »app_reset_password »)’
    Cela marchait bien et puis j’ai dû modifier toucher à un truc j’ai une erreur :
    Unable to generate a URL for the named route « app_reset_password » as such route does not exist
    => $url = $this->generateUrl(‘app_reset_password’, array(‘token’ => $token), UrlGeneratorInterface::ABSOLUTE_URL);

    J’essaye de voir d’où ça peut bien venir…

  5. Bonjour,
    Merci pour ce tutoriel.

    J’ai une petite question :

    Comment est ce que je suis supposé voir mes addflash (message d’erreur) si je redirige sur une autre page ?

    Merci d’avance pour votre réponse.

  6. slt je viens de faire ce tutoriel et il y a une petite coquille dans la declaration de la fonction register. Tu as oublié de déclarer l’entityManager (rien d’embêtant mais sans correction ça bug 😉 )

    merci pour les explications FOSUB est vraiment un support beaucoup trop lourd pour moi !!

  7. Bonjour,
    Je viens de faire ce tutoriel et j’ai un leger soucis notamment sur la connexion de mes user.
    Ma methode register n’est pas codé de la meme maniere, est ce pour ça que mon login ne fonctionne plus ?
    De plus, les requetes findOnebyEmail et findOneByResetToken ne sont pas déclarées, elles ne doivent elles pas etre codé dans le UserRepository ?
    Merci d’avance !!

  8. Bonjour,
    Super tuto!
    Je pense juste qu’il y a une erreur dans le fichier twig security/reset_password.html.twig à la ligne 11. Au lieu de:

    ça devrait être:

    C’est-à-dire qu’il fallait des doubles accolades autour de la variable ‘token’, selon la syntaxe de twig.
    Merci

  9. C’était un super tuto merci. La seul chose qui ma un peu embêter c’est que les use n’y était mais sinon j’ai pu les trouver et cela marche impeccable! Merci encore .

  10. Bonjour,
    le code fonctionne bien j’ai juste un soucis, je n’ai pas d’erreur de code le message d’envoie est là pour confirmer mais le mail ne s’envoie pas.
    Est-ce que ça pourrait être lié au fait que je sois en local ?

    1. Bonjour, oui sûrement, il te faut un smtp en local et modifier la ligne dans ton .env :

      ###> symfony/swiftmailer-bundle ###
      # For Gmail as a transport, use: "gmail://username:password@localhost"
      # For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
      # Delivery is disabled by default via "null://localhost"
      MAILER_URL=smtp://maildev:25
      ###< symfony/swiftmailer-bundle ###

Répondre à Guillaume Annuler la réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.