70 lines
2.7 KiB
PHP
70 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace App\Security;
|
|
|
|
use App\Entity\Participant;
|
|
use Doctrine\ORM\EntityManagerInterface;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
|
|
use Symfony\Component\Security\Core\Exception\AuthenticationException;
|
|
use Symfony\Component\Security\Core\User\UserInterface;
|
|
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
|
|
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
|
|
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
|
|
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
|
|
use Symfony\Component\Security\Core\User\UserProviderInterface;
|
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
|
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
|
|
|
class LoginFormAuthenticator extends AbstractAuthenticator
|
|
{
|
|
private $entityManager;
|
|
private $urlGenerator;
|
|
|
|
public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator)
|
|
{
|
|
$this->entityManager = $entityManager;
|
|
$this->urlGenerator = $urlGenerator;
|
|
}
|
|
|
|
public function supports(Request $request): ?bool
|
|
{
|
|
return $request->getPathInfo() === '/login' && $request->isMethod('POST');
|
|
}
|
|
|
|
public function authenticate(Request $request): Passport
|
|
{
|
|
$identifier = $request->request->get('username');
|
|
$password = $request->request->get('password');
|
|
|
|
// Chercher l'utilisateur par email ou pseudo
|
|
$user = $this->entityManager->getRepository(Participant::class)->findOneBy([
|
|
'email' => $identifier
|
|
]) ?? $this->entityManager->getRepository(Participant::class)->findOneBy([
|
|
'pseudo' => $identifier
|
|
]);
|
|
|
|
if (!$user) {
|
|
throw new AuthenticationException('Identifiant ou mot de passe incorrect.');
|
|
}
|
|
|
|
// Utilisation de UserBadge au lieu de Participant directement
|
|
return new Passport(
|
|
new UserBadge($user->getEmail()), // Utilisation de l'email ou du pseudo pour l'identification
|
|
new PasswordCredentials($password) // Ajout du mot de passe pour la vérification
|
|
);
|
|
}
|
|
|
|
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?RedirectResponse
|
|
{
|
|
return new RedirectResponse($this->urlGenerator->generate('home'));
|
|
}
|
|
|
|
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?RedirectResponse
|
|
{
|
|
return new RedirectResponse($this->urlGenerator->generate('app_login'));
|
|
}
|
|
}
|
|
|