Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Login système

    18 octobre 2018 à 10:25:20

    Bonjour,

    Je débute un peu sur symfony (4), je souhaite réaliser un système de connexion, j'ai suivi quelques cours, j'en ai déduis que le traitement de l'authentification était automatiquement géré par Symfony, j'ai donc ceci:

        /**
         * @Route("/connect", name="connect")
         */
        public function login(): Response
        {
            $user = new User();
            $form = $this->createFormBuilder($user)
                         ->add('email', EmailType::class, [
                             'translation_domain' => 'connect',
                         ])
                         ->add('password', PasswordType::class, [
                             'translation_domain' => 'connect',
                         ])
                         ->add('submit', SubmitType::class, [
                             'translation_domain' => 'connect',
                         ])
                         ->getForm();
    
            return $this->render('connect.html.twig', [
                'formConnect' => $form->createView(),
            ]);
        }
    security:
        # https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
        providers:
            my_provider:
                entity:
                    class: App\Entity\User
                    property: email
    
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: true
                form_login:
                    login_path: /connect
                    check_path: /connect
                    default_target_path: /dashboard
                    provider: my_provider
                logout:
                    path:   /disconnect
                    target: /

    or mon entité User ne contient pas de colonne Username, j'ai donc une erreur:

    The key "_username" must be a string, "NULL" given.

    lors de la validation de mon formulaire.

    Le fichier pointé du doigt est vendor\symfony\security\Http\Firewall\UsernamePasswordFormAuthenticationListener.php

    Donc j'imagine que je n'ai pas à le modifier.

    Merci d'avance pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2018 à 11:59:58

      Bonjour,
      c'est bien de lire des cours mais as-tu lu la documentation officiel qui explique comment faire?
      ce lien peux aussi t’intéresser

      -
      Edité par coolswing 18 octobre 2018 à 12:04:23

      • Partager sur Facebook
      • Partager sur Twitter
        18 octobre 2018 à 13:11:25

        Bonjour,

        Yes justement j'ai épilé la documentation ligne à ligne en essayant de comprendre ce que j'utilisais, mais pas très facile sachant que l'anglais me freine un peu ( pas beaucoup, je comprend, mais je comprend dans les grandes lignes )

        J'ai finalement résolu le problème, si certains tombent sur ce topic par une recherche google:

        Il ne faut pas créer le formulaire via le builder PHP comme je l'ai fait, le nom doit être exactement _username pour le champ utilisateur, du coup, j'ai du le tapper à la main dans mon template, par contre, il est possible de le changer ( mais je ne sais pas où, j'ai check l'intégralité des fichiers config .yaml de mon dossier config/ )

        Merci bien.

        • Partager sur Facebook
        • Partager sur Twitter
          18 octobre 2018 à 15:16:55

          Si tu veux changer ça c'est dans ton security.yml que ça devrai se paramétrer (d'après ce lien )
          • Partager sur Facebook
          • Partager sur Twitter
            18 octobre 2018 à 15:57:23

            J'ai également vu ça, or le 'property' ne permet pas de faire ceci justement
            • Partager sur Facebook
            • Partager sur Twitter
              17 avril 2019 à 9:48:08

              De ce que je sais, _username est automatiquement compris pas symfony comme username même si il est fait référence à l'email ou autre. Tu n'as sûrement pas préciser le _username dans ton input de login.

              • Partager sur Facebook
              • Partager sur Twitter
                19 août 2019 à 15:56:10

                C'est bien dans security.yaml. Pour moi, le username, c'est la colonne nom, donc :
                    providers:
                        user_provider:
                            entity:
                                class: App\Entity\User
                                property: 'nom'
                    firewalls:
                        main:
                            pattern: ^/
                            anonymous: true
                            provider: user_provider
                            form_login:
                              username_parameter: nom
                              password_parameter: password
                Selon moi, c'est un bug, parce que j'ai bien précisé la colonne 'nom' lors de la création de la classe de formulaire (+ la table en base, et le reste) par composer, et il m'aurait paru logique qu'il ajoute lui-même ce paramètre username_parameter. 
                Ceci dit, ça ne suffit pas. Le message 'The key "_username" must be a string, "NULL" given.' s'est simplement changé en 'The key "nom" must be a string, "NULL" given.'.
                Moi aussi, j'épluche la doc depuis plusieurs jours, mais je ne trouve pas le problème. Symfony, c'est peut-être magique quand ça marche, mais quand on tombe sur ce genre de lacune, c'est une belle galère.

                -
                Edité par Myosotis Arae 19 août 2019 à 17:30:27

                • Partager sur Facebook
                • Partager sur Twitter
                  20 août 2019 à 12:11:10

                  Bonjour dans ton entité User, tu dois avoir une fonction getUsername() : 

                  /**
                       * A visual identifier that represents this user.
                       *
                       * @see UserInterface
                       */
                      public function getUsername(): string
                      {
                          return (string) $this->username;
                      }

                  Si tu veux que l'email soit ton identifiant de connexion met :

                  /**
                       * A visual identifier that represents this user.
                       *
                       * @see UserInterface
                       */
                      public function getUsername(): string
                      {
                          return (string) $this->email;
                      }



                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 juin 2020 à 15:13:27

                    J'avais le même problème.

                    Il faut vérifier si l'entité Authenticator a bien la constante LOGIN_ROUTE à jour avec le nom de la route identique à celle indiquée dans le security.yml et la méthode du login route controller. Pour moi c'était ce qui a fait défaut. 

                    GL! :) 

                    • Partager sur Facebook
                    • Partager sur Twitter

                    [Symfony] Login système

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown