Symfony 4 : Gestion utilisateurs sans FOSUserBundle v2018 : Chapitre 2

Cet article est écrit en 3 parties :

Au chapitre précédent on a mis en place notre base de données et l’avons alimenté de quelques users, maintenant il va bien falloir qu’ils se connectent !

Vu que je suis très feignant, je vais encore utiliser le maker pour faire le travail à ma place. Mais avant on va supprimer la fonction login() du controller et aussi supprimer le template security/login.html.twig.vue, une fois fait on va lancer le maker :

Vous pouvez maintenant vous connecter à http://127.0.0.1:8000/login, et tada le beau formulaire ! Vous pouvez même essayer de vous logguer, vous devriez avoir une erreur du style « TODO: provide a valid redirect inside  » mais on verra ça plus tard, en attendant vous êtes bien connectés !

Si vous regardez de plus prés le maker a fait un gros boulot, il a non seulement créé la page twig et le controller mais aussi LoginFormAuthenticator (src/Security/LoginFormAuthenticator.php) et la modif du fichier security.yaml !

Quelques petites choses à savoir sur le LoginFormAuthenticator, il comporte une fonction supports, cette fonction sera appelé à chaque requête, il suffit de retourner vrai lorsque l’on est sûr que la page est bien une page de connexion et que l’on est sur une méthode POST, si ça retourne false, le traitement s’arrête (vous pouvez faire le test en modifiant le nom de la route « app_login ») si ça retourne vrai, le traitement continue sur la fonction getCredentials.

Cette dernière va tout simplement recuperer les identifiants de connexion et les stocker dans la session, puis va ensuite appeler getUser qui va se charger de vérifier que l’email existe bien.

Enfin la fonction checkCredentials va vérifier que le mot de passe est correcte.

Si tout s’est bien passé c’est onAuthenticationSuccess qui sera appelé pour en terminer avec cette connexion.

C’est là où on doit intervenir (et oui faut bien bosser un peu), on va créer un controller default avec une route homepage qui sera notre page principale. On va pour ça encore utiliser le fameux maker :

Une fois fait on va pouvoir modifier la onAuthenticationSuccess :

Ce qui serait intéressant maintenant que l’on est connecté, c’est de pouvoir se … déconnecter !

D’abord, modifions le fichier security.yaml pour y ajouter la section logout :

On va ajouter pour ça une fonction logout dans le SecurityController :

Et c’est tout !!

On va terminer en ajoutant une section « Se rappeler de moi » afin que l’utilisateur reste connecté quand il reviendra sur le site.

On va d’abord decommenter dans le fichier login.html.twig les lignes :

Puis ajouter dans le security.yaml :

Pour vérifier que ça fonctionne il suffit de regarder dans la console de chrome :

On voir bien que la date d’expiration est à 30 jours.

On verra dans les prochains chapitres comment s’inscrire, récupérer son mot de passe, modifier son profil et enfin gérer les droits d’accès à certaines pages.

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

25 commentaires

  1. Bonjour,

    J’ai effectuer la manipulation du make:auth, et peux importe ce que je met dans le mot de passe, je retombe toujours dessus, je n’est pas l’erreur « normale » comme toi.

    L’adresse mail et le mot de passe son bien ceci :

    userdemo0@example.com et userdemo ?

    Merci à toi

  2. Suis Debutant mais je trouve que c est un Tres bon tuto , mais par contre j ai un petit soucis avec : php bin/console make:auth

    il met m affiche ça :

    What style of authentication do you want? [Empty authenticator]:
    [0] Empty authenticator
    [1] Login form authenticator
    >

    The class name of the authenticator to create (e.g. AppCustomAuthenticator):
    > UserAppAuthenticator

    created: src/Security/UserAppAuthenticator.php
    updated: config/packages/security.yaml

    que simplement deux fichier sont concerné

  3. Bonjour !
    Ton tuto est top ayant fait le précédant tuto pour sf4 sans fos j’ai préféré grandement cette manière de procédé.

    Il y a juste un hic pour moi ( je suis allé au bout de ton tuto )

    Je lève une erreur à la connexion : The key « _username » must be a string, « NULL » given.

    Alors que nul part, je n’ai d’username (excepter la method qui return un this email )
    Peux-tu m’éclaircir ?
    Quelqu’un a déjà eu ce problème ?

        1. Ah oui c’est vrai que l’on se connecte avec l’email.
          Vérifie que dans ton config.yml tu as bien ça :
          providers:
          # used to reload user from session & other features (e.g. switch_user)
          app_user_provider:
          entity:
          class: App\Entity\User
          property: email

          (ça veut dire que la clé pour se connecter est l’email, et non l’username)

    1. Bizarre qu’as-tu ici dans la function getCredentials ?

      public function getCredentials(Request $request)
      {
      $credentials = [
      ’email’ => $request->request->get(’email’),
      ‘password’ => $request->request->get(‘password’),
      ‘csrf_token’ => $request->request->get(‘_csrf_token’),
      ];
      $request->getSession()->set(
      Security::LAST_USERNAME,
      $credentials[’email’]
      );
      return $credentials;
      }

      1. J’ai exactement la même

        Avant de venir commenter j’ai cherché un peu les différences qu’il y a avec ton github, J’en est trouvé aucune ci ce n’ai le nom des routes

  4. Uncaught PHP Exception Symfony\Component\HttpKernel\Exception\BadRequestHttpException: « The key « _username » must be a string, « NULL » given. » at C:\Users\Elkawaie\Documents\Client Freelance\Dev-Yaute\vendor\symfony\security-http\Firewall\UsernamePasswordFormAuthenticationListener.php line 89

    La voila

  5. Alors je viens de trouver la solution, je l’ai fait au feeling d’ailleurs, je ne sais pas pourquoi j’ai eu l’idée de faire

    Si tu es capable de m’expliquer le pourquoi du comment, j’accepte grandement .

    Je te disais la seule chose que j’ai changée, ce sont les route ‘homepage’ par ‘default’
    Et app_login par security_login ( Alors que dans mon security.Yml, j’ai

    form_login:
    # Le nom de la route de la page de connexion
    check_path: security_login
    # Le nom de la route ou ce trouve le formulaire de connexion
    # Si un utilisateur tente d’acceder à une page protégée sans en avoir
    # Les droit il sera redirigé sur cette page
    login_path: security_login
    # Securisation des formulaires
    csrf_token_generator: security.csrf.token_manager
    # La page par default aprés une connexion réussie
    default_target_path: admin )

    Et bah crois le ou pas le faite de repasser sur app_login je ne lève plus l’erreur et je me log .
    L’erreur était donc sur le path de mon lien …

    Qu’en pense tu ?
    En tout cas merci pour ta réactivité.

  6. bonjour ,
    tres bon tuto , mais j ‘ai une eurreur qui s affiche toujours :
    Invalid credentials.
    pourtant e mot de passe et le login sont correcte

    1. Bonjour, comme ça c’est compliqué à déterminer ça peut venir de pas mal de choses, est-ce que tu mets bien le port à la fin de ton url ? (ex : tonsite.localhost:8072)

Répondre à Feriel 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.