src/Security/LoginFormAuthenticator.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use Symfony\Component\HttpFoundation\RedirectResponse;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  7. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  8. use Symfony\Component\Security\Core\Security;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
  11. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\PassportInterface;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\UserPassportInterface;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  17. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  18. use Doctrine\ORM\EntityManagerInterface;
  19. use App\Entity\User;
  20. use Symfony\Component\HttpFoundation\Cookie;
  21. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  22. class LoginFormAuthenticator extends AbstractLoginFormAuthenticator
  23. {
  24. use TargetPathTrait;
  25. public const LOGIN_ROUTE = 'app_login';
  26. private UrlGeneratorInterface $urlGenerator;
  27. public function __construct(UrlGeneratorInterface $urlGenerator, EntityManagerInterface $entityManager)
  28. {
  29. $this->urlGenerator = $urlGenerator;
  30. $this->entityManager = $entityManager;
  31. }
  32. public function authenticate(Request $request): PassportInterface
  33. {
  34. $email = $request->request->get('email', '');
  35. $userRepository = $this->entityManager->getRepository(User::class);
  36. $user = $userRepository->findOneBy(['email' => $email]);
  37. if (!$user || !$user->getIsActive()=== 0 ) {
  38. throw new AuthenticationException('User account is inactive.');
  39. }
  40. $request->getSession()->set(Security::LAST_USERNAME, $email);
  41. return new Passport(
  42. new UserBadge($email),
  43. new PasswordCredentials($request->request->get('password', '')),
  44. [
  45. new CsrfTokenBadge('authenticate', $request->get('_csrf_token')),
  46. ]
  47. );
  48. }
  49. public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
  50. {
  51. $email = $request->request->get('email', '');
  52. $userRepository = $this->entityManager->getRepository(User::class);
  53. $user = $userRepository->findOneBy(['email' => $email]);
  54. if($user !== null)
  55. $user->setCount(0);
  56. $this->entityManager->flush();
  57. if ($request->isXmlHttpRequest()) {
  58. return new JsonResponse(["OK" => "Identification réussie"]);
  59. }
  60. if ($targetPath = $this->getTargetPath($request->getSession(), $firewallName)) {
  61. return new RedirectResponse($targetPath);
  62. }
  63. $referer = $request->headers->get('referer');
  64. $referer = str_replace('register', '', $referer);
  65. return new RedirectResponse($referer);
  66. }
  67. public function onAuthenticationFailure(Request $request, AuthenticationException $exception): Response
  68. {
  69. $email = $request->request->get('email', '');
  70. $userRepository = $this->entityManager->getRepository(User::class);
  71. $user = $userRepository->findOneBy(['email' => $email]);
  72. if (!$user) {
  73. return parent::onAuthenticationFailure($request, $exception);
  74. }
  75. $count = $user->getCount() + 1;
  76. $user->setCount($count);
  77. if ($count > 8 && $user->getIsActive()) {
  78. $user->setIsActive(false);
  79. $user->setCount(0);
  80. }
  81. $this->entityManager->flush();
  82. $response = parent::onAuthenticationFailure($request, $exception);
  83. return $response;
  84. }
  85. public function supports(Request $request): bool
  86. {
  87. return $request->attributes->get('_route') === self::LOGIN_ROUTE && $request->isMethod('POST');
  88. }
  89. protected function getLoginUrl(Request $request): string
  90. {
  91. return $this->urlGenerator->generate(self::LOGIN_ROUTE);
  92. }
  93. }