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
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
providers:
app_user_provider:
entity:
class: App\Entity\User
property: email
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