src/Security/EmailAuthenticator.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\Security\Core\Security;
  6. use Symfony\Component\HttpFoundation\Response;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\Security\Http\Util\TargetPathTrait;
  9. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  12. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  14. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
  15. use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
  16. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
  17. class EmailAuthenticator extends AbstractLoginFormAuthenticator
  18. {
  19.     use TargetPathTrait;
  20.     public const LOGIN_ROUTE 'app_login';
  21.     private UrlGeneratorInterface $urlGenerator;
  22.     private $em;
  23.     private $flashBag;
  24.     public function __construct(UrlGeneratorInterface $urlGeneratorEntityManagerInterface $emSessionInterface $session)
  25.     {
  26.         $this->urlGenerator $urlGenerator;
  27.         $this->em $em;
  28.         $this->flashBag $session->getFlashBag();
  29.     }
  30.     
  31.     /**
  32.      * authenticate
  33.      *
  34.      * @param  mixed $request
  35.      * @return Passport
  36.      */
  37.     public function authenticate(Request $request): Passport
  38.     {
  39.         $email $request->request->get('email''');
  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->request->get('_csrf_token')),
  46.             ]
  47.         );
  48.     }
  49.     
  50.     /**
  51.      * onAuthenticationSuccess
  52.      *
  53.      * @param  mixed $request
  54.      * @param  mixed $token
  55.      * @param  mixed $firewallName
  56.      * @return Response
  57.      */
  58.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  59.     {
  60.         $user $token->getUser();
  61.         $user->setOnline(1);
  62.         $user->setLoginAt(new \DateTime('now'));
  63.         $this->em->flush();
  64.         $this->flashBag->add('success''Vous ĂȘtes connectĂ©');
  65.         if ($targetPath $this->getTargetPath($request->getSession(), $firewallName)) {
  66.             return new RedirectResponse($targetPath);
  67.         }
  68.         
  69.         // For example:
  70.         return new RedirectResponse($this->urlGenerator->generate('home'));
  71.         throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
  72.     }
  73.     
  74.     /**
  75.      * getLoginUrl
  76.      *
  77.      * @param  mixed $request
  78.      * @return string
  79.      */
  80.     protected function getLoginUrl(Request $request): string
  81.     {
  82.         return $this->urlGenerator->generate(self::LOGIN_ROUTE);
  83.     }
  84. }