vendor/symfony/security-http/RememberMe/SignatureRememberMeHandler.php line 37

  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\RememberMe;
  11. use Psr\Log\LoggerInterface;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  14. use Symfony\Component\Security\Core\Signature\Exception\ExpiredSignatureException;
  15. use Symfony\Component\Security\Core\Signature\Exception\InvalidSignatureException;
  16. use Symfony\Component\Security\Core\Signature\SignatureHasher;
  17. use Symfony\Component\Security\Core\User\UserInterface;
  18. use Symfony\Component\Security\Core\User\UserProviderInterface;
  19. /**
  20.  * Implements safe remember-me cookies using the {@see SignatureHasher}.
  21.  *
  22.  * This handler doesn't require a database for the remember-me tokens.
  23.  * However, it cannot invalidate a specific user session, all sessions for
  24.  * that user will be invalidated instead. Use {@see PersistentRememberMeHandler}
  25.  * if you need this.
  26.  *
  27.  * @author Wouter de Jong <wouter@wouterj.nl>
  28.  */
  29. final class SignatureRememberMeHandler extends AbstractRememberMeHandler
  30. {
  31.     private SignatureHasher $signatureHasher;
  32.     public function __construct(SignatureHasher $signatureHasherUserProviderInterface $userProviderRequestStack $requestStack, array $optionsLoggerInterface $logger null)
  33.     {
  34.         parent::__construct($userProvider$requestStack$options$logger);
  35.         $this->signatureHasher $signatureHasher;
  36.     }
  37.     public function createRememberMeCookie(UserInterface $user): void
  38.     {
  39.         $expires time() + $this->options['lifetime'];
  40.         $value $this->signatureHasher->computeSignatureHash($user$expires);
  41.         $details = new RememberMeDetails($user::class, $user->getUserIdentifier(), $expires$value);
  42.         $this->createCookie($details);
  43.     }
  44.     public function consumeRememberMeCookie(RememberMeDetails $rememberMeDetails): UserInterface
  45.     {
  46.         try {
  47.             $this->signatureHasher->acceptSignatureHash($rememberMeDetails->getUserIdentifier(), $rememberMeDetails->getExpires(), $rememberMeDetails->getValue());
  48.         } catch (InvalidSignatureException $e) {
  49.             throw new AuthenticationException('The cookie\'s hash is invalid.'0$e);
  50.         } catch (ExpiredSignatureException $e) {
  51.             throw new AuthenticationException('The cookie has expired.'0$e);
  52.         }
  53.         return parent::consumeRememberMeCookie($rememberMeDetails);
  54.     }
  55.     public function processRememberMe(RememberMeDetails $rememberMeDetailsUserInterface $user): void
  56.     {
  57.         try {
  58.             $this->signatureHasher->verifySignatureHash($user$rememberMeDetails->getExpires(), $rememberMeDetails->getValue());
  59.         } catch (InvalidSignatureException $e) {
  60.             throw new AuthenticationException('The cookie\'s hash is invalid.'0$e);
  61.         } catch (ExpiredSignatureException $e) {
  62.             throw new AuthenticationException('The cookie has expired.'0$e);
  63.         }
  64.         $this->createRememberMeCookie($user);
  65.     }
  66. }