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

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\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.     /**
  38.      * {@inheritdoc}
  39.      */
  40.     public function createRememberMeCookie(UserInterface $user): void
  41.     {
  42.         $expires time() + $this->options['lifetime'];
  43.         $value $this->signatureHasher->computeSignatureHash($user$expires);
  44.         $details = new RememberMeDetails(\get_class($user), $user->getUserIdentifier(), $expires$value);
  45.         $this->createCookie($details);
  46.     }
  47.     public function consumeRememberMeCookie(RememberMeDetails $rememberMeDetails): UserInterface
  48.     {
  49.         try {
  50.             $this->signatureHasher->acceptSignatureHash($rememberMeDetails->getUserIdentifier(), $rememberMeDetails->getExpires(), $rememberMeDetails->getValue());
  51.         } catch (InvalidSignatureException $e) {
  52.             throw new AuthenticationException('The cookie\'s hash is invalid.'0$e);
  53.         } catch (ExpiredSignatureException $e) {
  54.             throw new AuthenticationException('The cookie has expired.'0$e);
  55.         }
  56.         return parent::consumeRememberMeCookie($rememberMeDetails);
  57.     }
  58.     public function processRememberMe(RememberMeDetails $rememberMeDetailsUserInterface $user): void
  59.     {
  60.         try {
  61.             $this->signatureHasher->verifySignatureHash($user$rememberMeDetails->getExpires(), $rememberMeDetails->getValue());
  62.         } catch (InvalidSignatureException $e) {
  63.             throw new AuthenticationException('The cookie\'s hash is invalid.'0$e);
  64.         } catch (ExpiredSignatureException $e) {
  65.             throw new AuthenticationException('The cookie has expired.'0$e);
  66.         }
  67.         $this->createRememberMeCookie($user);
  68.     }
  69. }