Bonjour,

Après deux semaines de formation avec Symfony, j'ai créé un site web. J'ai créé une entité "User" et tout ce qu'il faut pour pouvoir accéder au site grâce à un page "login". Mais quand j'essaye de rentrer avec les identifiants et le mot de passe d'un utilisateur entré dans ma base de donnée, je suis redirigée vers la page "login" sans parvenir à me connecter. Je précise que j'utilise la dernière version de Symfony actuelle 6.0.2.

Ce que je veux

Réussir à me connecter en tant qu'utilisateur présent dans ma base de données.

Ce que j'obtiens

Impossible de passer le portail de la connexion. Je suis redirigée vers la page "login".

14 réponses


Hello !
Je n'utilise pas Symfony donc je ne pourrai surement pas t'aider. Mais est ce que tu as un moyen d'afficher les erreurs PHP ?
Sinon, as tu regardé dans ta BDD, ton couple user / mot de pass existe bien ?

Dans ta vue, est ce que tu generes un message d'erreur au cas ou l'utilisateur entre un mauvais nom ou un mauvais mot de passe par exemple ? Le tout est de savoir si tu es redirigée a cause d'une erreur de droit, une erreur php, une erreur de saisie etc etc ..

Je ne t'ai surement pas aidé, mais bon .. on ne sait jamais, ça peut te donner des pistes pour le débug ;)

Bonjour Arzou,

Merci pour ta réponse, car je suis vraiment dans une impasse... Alors, non, il n'affiche pas d'erreur. Je suis tout simplement redirigée vers la page login comme si je n'avais pas essayé de me connecter. Et oui, mes users sont entrés correctement dans ma basse de données, donc ils existent... Je repète qu'il n'y a pas d'erreur qui s'affiche. :-)

Salut :)

Alors c'est possible de voir le controller login? ^^


<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class SecurityController extends AbstractController
{
    /**
     * @Route("/login", name="app_login")
     */
    public function login(AuthenticationUtils $authenticationUtils): Response
    {
        // if ($this->getUser()) {
        //     return $this->redirectToRoute('target_path');
        // }

        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();
        // last username entered by the user
        $email = $authenticationUtils->getLastUsername();

        return $this->render('security/login.html.twig', ['email' => $email, 'error' => $error]);
    }

    /**
     * @Route("/logout", name="app_logout")
     */
    public function logout(): void
    {
        throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
    }
}

Oui popotte. Le voici :-)

Merci d'avance pour votre aide.
J'espère qu'on réussira ensemble à trouver quelque chose...

Mmmmh ça m'a l'air bon :X

Alors le form et la route, c'est bon aussi ?

Après je ne connais pas trop Synfo (je suis sur Laravel x)) mais dans la doc Synfony il n'utilise pas l'email mais le last_user_name (en principe c'est pas important, mais comme Synfo à pas mal d'abstraction je me dis que peut être ^^')

https://symfony.com/doc/current/security.html#form-login

# config/packages/security.yaml
security:
    # ...

    firewalls:
        secured_area:
            # ...
            form_login:
                # ...
                enable_csrf: true

<form action="{{ path('login') }}" method="post">
    {# ... the login fields #}

    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">

    <button type="submit">login</button>
</form>
public function index(AuthenticationUtils $authenticationUtils): Response
{
         // get the login error if there is one
         $error = $authenticationUtils->getLastAuthenticationError();

         // last username entered by the user
         $lastUsername = $authenticationUtils->getLastUsername();

          return $this->render('login/index.html.twig', [
             'last_username' => $lastUsername,
             'error'         => $error,
          ]);
}

avec plaisir ^^

Oui il y'a toujours une solution :p

Bonjour popotte,

Oui, pour le formulaire et la function en-dessous de ma route "login", c'est bon. J'ai tout pareil pour le front et le controller. En revanche, je n'avais pas la même chose dans le security.yalm. J'ai ajouté ce qui manquait, puis j'ai testé. Malheureusement, ça n'a rien changé. Après avoir essayé de me connecter (avec les bons identifiants enregistrés dans ma base de données) je suis toujours redirigée vers ma page login, comme si je n'avais pas essayé d'entrer avec des identifiants...

J'ai discuté de ce problème avec une des mes camarades de la formation (qui a le même problème avec le login). Elle est étonnée de ne voir apparaître aucune erreur, car normalement les erreurs devraient aussi s'afficher si mes identifiants ne sont pas trouvés par exemple dans la base de données... Du coup, je cherche des hypothèses pour savoir "Pourquoi ça ne fonctionne pas ?".

Je suis tombée sur cet article. Je me suis dis que peut-être il y a un problème avec SerializableInterface, mais je n'ai pas trouvé cette classe dans mon code. (Désolée, c'est en anglais) :

Understanding how Users are Refreshed from the Session

At the end of every request (unless your firewall is stateless), your User object is serialized to the session. At the beginning of the next request, it's deserialized and then passed to your user provider to "refresh" it (e.g.Doctrine queries for a fresh user).

Then, the two User objects (the original from the session and the refreshed User object) are "compared" to see if they are "equal". By default, the core AbstractToken class compares the return values of the getPassword(), getSalt () and getUserIdentifier () methods. If any of these are different, your user will be logged out. This is a security measure to make sure that malicious users can be de-authenticated if core user data changes.

However, in some cases, this process can cause unexpected authentication problems. If you're having problems authenticating, it could be that you are authenticating successfully, but you immediately lose authentication after the first redirect.

In that case, review the serialization logic (e.g. SerializableInterface) on you user class (if you have any) to make sure that all the fields necessary are serialized.

Salut Emile, alors pour les règles synfo oui c'est bizarre de ne pas avoir d'erreur

En principe cette partie devrait en afficher une

    {% if error %}
        <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
    {% endif %}

Sinon tu peux tenter un truc, ouvres ton inspecteur dans la page login, va dand l'onglet network (ou réseau selon le navigateur) et fait ta connection, et vérifies si tu as un code different de 200 dans cet inspecteur

Si y'a rien tentes un truc, dans le controller qui s'occupe du login fais un dd de la requete et du user selectionné pour comparer

Sinon question bête mais ton user en base de données est en clair? ^^'

J'ai fait ce que tu m'as dit. En ouvrant l'inspecteur, j'ai eu 200 pour login et 200 pour quelque chose pour porte ce nom de code : 7cb148.

J'ai entré dd("Succès d'authentification"); dans ma fonction onAuthenticationSuccess().
Où est-ce que je dois regarder exactement pour voir apparaître dd() ?

Oui, le user dans ma base de données est en clair.

Bon le nom de code y a pas à s'en occuper, par contre pour le login 200 ça veut dire qu'il n'y a pas d'erreurs

Okay alors j'ai un peu checké dans la doc (c'est ultra opaque Synfo :X)

Et la solution serait dans security.yaml et la page twig du login

Tu peux envoyer le contenu des deux fichiers security.yaml et login/index.html.twig? :)

La solution vient d'être trouvée ! Un dev m'a donné la fonction à ajouter dans le AppCustomAuthentificator.php :

public function supports(Request $request): bool
{
return 'app_login' === $request->attributes->get('_route') && $request->isMethod('POST');
}

Je n'ai plus qu'à donner les bonnes routes... car je suis redirigée sur la partie admin même quand je me connecter en tant que ["ROLE_USER"].

Merci beaucoup popotte pour ton aide ! ;-)
Ça donne du courage quand les internautes aident à creuser et à comprendre d'où vient le problème.
C'était cool ! Merci. :)

Ah génial ! ^^

Bon ça m'aura permis d'apprendre un peu Symfo :p

Ahah merci c'est gentil ^^

Hesites pas si y'a d'autres questions :p