Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Symfony] Connexion automatique ne fonctionne pas

Sujet résolu
    22 janvier 2020 à 23:47:38

    Bonjour,

    Je suis  sur Symfony 5 et je n'arrive pas à faire fonctionner le "remember me" lors d'une connexion sur le site.

    Mon controller :

        /**
         * @Route("/connexion", name="security_login")
         */
        public function login(AuthenticationUtils $authenticationUtils, AuthorizationCheckerInterface $authorizationChecker)
        {
            // Si le visiteur est déjà identifié, on le redirige vers l'accueil
            if ($authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
                return $this->redirectToRoute('home_index');
            }
    
            $error = $authenticationUtils->getLastAuthenticationError();
            $lastUsername = $authenticationUtils->getLastUsername();
    
            return $this->render('security/login.html.twig', [
                'last_username' => $lastUsername,
                'error' => $error
            ]);
        }

    Mon template :

        {% if error %}
            <div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
        {% endif %}
    
        <form action="{{ path('security_login') }}" method="post">
            <div class="form-group">
                <input placeholder="Email" required type="text" class="form-control" name="_username" value="{{ last_username }}">
            </div>
            <div class="form-group">
                <input placeholder="Mot de passe" required type="password" class="form-control" name="_password">
            </div>
    
            <div class="checkbox mb-3">
                <label>
                    <input type="checkbox" name="_remember_me"> Se souvenir de moi
                </label>
            </div>
    
            <div class="form-group">
                <button type="submit" class="btn btn-success">Connexion</button>
            </div> 
            <input type="hidden" name="token" value="{{ csrf_token('authenticate') }}"/>
        </form>


    Mon security.yaml :

    security:
    
        encoders:
            App\Entity\User:
                algorithm: bcrypt
    
        providers:
            in_memory: { memory: null }
            in_database:
                entity:
                    class: App\Entity\User
                    property: email
        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: lazy
    
                provider: in_database
                form_login:
                    login_path: security_login
                    check_path: security_login
                    use_referer: true
    
                logout:
                    path: security_logout
                    target: home_index
    
                remember_me:
                    secret: '%env(APP_SECRET)%'
                    token_provider: 'Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider'
    
        access_control:
            # - { path: ^/admin, roles: ROLE_ADMIN }
            # - { path: ^/profile, roles: ROLE_USER }

    Avez-vous une idée ?

    Merci


    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2020 à 0:30:41

      Bonsoir, 

      Je vois que tu as opter pour la solution de stoker les tokens en base de données, as tu enregistrer le service associé dans le fichier services.yaml: 

      services:
          # ...
      
          Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider: ~

      et pris soin de créer la table en base de donnée associé également?

      CREATE TABLE `rememberme_token` (
          `series`   char(88)     UNIQUE PRIMARY KEY NOT NULL,
          `value`    char(88)     NOT NULL,
          `lastUsed` datetime     NOT NULL,
          `class`    varchar(100) NOT NULL,
          `username` varchar(200) NOT NULL
      );



      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2020 à 8:28:04

        Oui, cela est mis en place et j'ai bien vérifié, lors de ma connexion le token est bien enregistré dans ma BDD.
        • Partager sur Facebook
        • Partager sur Twitter
          24 janvier 2020 à 16:10:07

          Salut,

          dans security.yaml tu peux compléter avec des paramètres supplémentaires ex :

          remember_me:
                          secret:   '%kernel.secret%'
                          lifetime: 604800 # 1 week in seconds
                          path:     /
                          secure: true
                          remember_me_parameter: _remember_me



          • Partager sur Facebook
          • Partager sur Twitter
            24 janvier 2020 à 17:50:20

            Edit :

            J'ai trouvé pourquoi !

            Lorsque symfony me sauvegarde les données pour la session, il prend en compte mon username alors que mon identifiant se base sur l'adresse email.

            Quand je remplace le contenu de mon champ "username" par mon adresse email dans la table "rememberme_token", ça fonctionne.

            Pour corriger cela, j'ai modifié la fonction getUsername() qui se trouve dans mon entité User :
            public function getUsername(): ?string
            {
                return $this->email;
            }

            -
            Edité par s0ak 5 février 2020 à 16:39:29

            • Partager sur Facebook
            • Partager sur Twitter

            [Symfony] Connexion automatique ne fonctionne pas

            × 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