vendor/symfony/security-http/EventListener/RememberMeListener.php line 40

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Security\Http\EventListener;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
  14. use Symfony\Component\Security\Http\Event\LoginFailureEvent;
  15. use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
  16. use Symfony\Component\Security\Http\Event\LogoutEvent;
  17. use Symfony\Component\Security\Http\Event\TokenDeauthenticatedEvent;
  18. use Symfony\Component\Security\Http\RememberMe\RememberMeHandlerInterface;
  19. /**
  20.  * The RememberMe *listener* creates and deletes remember-me cookies.
  21.  *
  22.  * Upon login success or failure and support for remember me
  23.  * in the firewall and authenticator, this listener will create
  24.  * a remember-me cookie.
  25.  * Upon login failure, all remember-me cookies are removed.
  26.  *
  27.  * @author Wouter de Jong <wouter@wouterj.nl>
  28.  *
  29.  * @final
  30.  */
  31. class RememberMeListener implements EventSubscriberInterface
  32. {
  33.     private RememberMeHandlerInterface $rememberMeHandler;
  34.     private ?LoggerInterface $logger;
  35.     public function __construct(RememberMeHandlerInterface $rememberMeHandlerLoggerInterface $logger null)
  36.     {
  37.         $this->rememberMeHandler $rememberMeHandler;
  38.         $this->logger $logger;
  39.     }
  40.     public function onSuccessfulLogin(LoginSuccessEvent $event): void
  41.     {
  42.         $passport $event->getPassport();
  43.         if (!$passport->hasBadge(RememberMeBadge::class)) {
  44.             $this->logger?->debug('Remember me skipped: your authenticator does not support it.', ['authenticator' => \get_class($event->getAuthenticator())]);
  45.             return;
  46.         }
  47.         // Make sure any old remember-me cookies are cancelled
  48.         $this->rememberMeHandler->clearRememberMeCookie();
  49.         /** @var RememberMeBadge $badge */
  50.         $badge $passport->getBadge(RememberMeBadge::class);
  51.         if (!$badge->isEnabled()) {
  52.             $this->logger?->debug('Remember me skipped: the RememberMeBadge is not enabled.');
  53.             return;
  54.         }
  55.         $this->logger?->debug('Remember-me was requested; setting cookie.');
  56.         $this->rememberMeHandler->createRememberMeCookie($event->getUser());
  57.     }
  58.     public function clearCookie(): void
  59.     {
  60.         $this->rememberMeHandler->clearRememberMeCookie();
  61.     }
  62.     public static function getSubscribedEvents(): array
  63.     {
  64.         return [
  65.             LoginSuccessEvent::class => ['onSuccessfulLogin', -64],
  66.             LoginFailureEvent::class => 'clearCookie',
  67.             LogoutEvent::class => 'clearCookie',
  68.             TokenDeauthenticatedEvent::class => 'clearCookie',
  69.         ];
  70.     }
  71. }