Bonjour à tous, je débute sur symfony et je vien de créer un login et une page d'inscription. Quand je veux me connecter sur la page login, la redirection ne ce fait pas. Voici l'erreur de symfony.

Apparament l'erreur vien de la fonction onAuthenticationSuccess.

public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
    {
        if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
            return new RedirectResponse($targetPath);
        }

        // For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
        throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
    }

Cordialement

10 réponses


Salut,

Symfony a mis en place plusieurs nouvelles commandes afin de nous simplifier la vie et notamment sur la partie User et Authentification.

1- php bin/console make:user // permet de créer l'Entity User avec la gestion des rôles etc.
2- php bin/console make:Auth // permet de créer le SecurityController et à la fin il te demande si tu veux créer la page login directement
3- php bin/console make:reset-password // permet de créer la partie Reset (mot de passe oublié)
4- php bin/console make:crud "nomEntity" (ici User) // permet de créer un CRUD automatisé.

Avec ça tu devrais pouvoir mettre en place ton système de login/mot de passe plus facilement.

++

// For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);

Tu mets t'as route ici comme le commentaire le dit, par example :

return new RedirectResponse($this->urlGenerator->generate('homepage'));

Si t'as route ou tu veux tomber s'appelle homepage

Et tu enlèves bien entendu la ligne qui commence par throw new....

Merci du Conseil. Pour créer mon login j'ai utiliser la commande php bin/console make:user et j'ai modifier la redirection avec une route mais je tombe sur l'erreur

There is no user provider for user "App\Entity\Users". Shouldn't the "supportsClass()" method of your user provider return true for this classname?

Je suis bloquer à ce niveau .

ICI tu fais appel à l'Entity App\Entity\Users (Users) alors que ton Entity s'appelle User sans s

Voila le code qui à eté générer par la commande php bin/console make:auth. J'ai modifier la ligne pour rediriger vers la route et ca me donne cette erreur. Je ne voie pas ou est l'erreur.

<?php

namespace App\Security;

use App\Entity\Users;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
use Symfony\Component\Security\Guard\PasswordAuthenticatedInterface;
use Symfony\Component\Security\Http\Util\TargetPathTrait;

class UsersAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
{
    use TargetPathTrait;

    public const LOGIN_ROUTE = 'app_login';

    private $entityManager;
    private $urlGenerator;
    private $csrfTokenManager;
    private $passwordEncoder;

    public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
    {
        $this->entityManager = $entityManager;
        $this->urlGenerator = $urlGenerator;
        $this->csrfTokenManager = $csrfTokenManager;
        $this->passwordEncoder = $passwordEncoder;
    }

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

    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;
    }

    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        $token = new CsrfToken('authenticate', $credentials['csrf_token']);
        if (!$this->csrfTokenManager->isTokenValid($token)) {
            throw new InvalidCsrfTokenException();
        }

        $user = $this->entityManager->getRepository(Users::class)->findOneBy(['email' => $credentials['email']]);

        if (!$user) {
            // fail authentication with a custom error
            throw new CustomUserMessageAuthenticationException('Email could not be found.');
        }

        return $user;
    }

    public function checkCredentials($credentials, UserInterface $user)
    {
        return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
    }

    /**
     * Used to upgrade (rehash) the user's password automatically over time.
     */
    public function getPassword($credentials): ?string
    {
        return $credentials['password'];
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
    {
        if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
            return new RedirectResponse($targetPath);
        }

        // For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
        throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
    }

    protected function getLoginUrl()
    {
        return $this->urlGenerator->generate(self::LOGIN_ROUTE);
    }
}

Salut,

Remplace

throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);

par

return new RedirectResponse($this->urlGenerator->generate('home'));

Nota: home ici correspond à ma home page, libre à toi de rediriger vers la page que tu veux

Pourtant c'est ce que j'ai fait mais j'ai toujours l'erreur

There is no user provider for user "App\Entity\Users". Shouldn't the "supportsClass()" method of your user provider return true for this classname?

Regarde du côté du fichier sécurity.yaml

voici l'exmple de mon provider toi tu auras probablement:
entity:
class: App\Entity\User
property: ici il faut renseigne la proprieté qui te sert à la connexion, par exemple moi c'est email

config/security.yaml
providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email

Pourant j'ai la meme chose, moi aussi, c'est l'emain qui sert de logon.

je ne pense pas que c'est ce que tu as fait, sinon ça devrait fonctionner.

STP poste ici l'état actuel des class User et UsersAuthenticator