vendor/symfony/security-csrf/TokenStorage/SessionTokenStorage.php line 59

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\Csrf\TokenStorage;
  11. use Symfony\Component\HttpFoundation\Exception\SessionNotFoundException;
  12. use Symfony\Component\HttpFoundation\RequestStack;
  13. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  14. use Symfony\Component\Security\Csrf\Exception\TokenNotFoundException;
  15. /**
  16.  * Token storage that uses a Symfony Session object.
  17.  *
  18.  * @author Bernhard Schussek <bschussek@gmail.com>
  19.  */
  20. class SessionTokenStorage implements ClearableTokenStorageInterface
  21. {
  22.     /**
  23.      * The namespace used to store values in the session.
  24.      */
  25.     public const SESSION_NAMESPACE '_csrf';
  26.     private RequestStack $requestStack;
  27.     private string $namespace;
  28.     /**
  29.      * Initializes the storage with a RequestStack object and a session namespace.
  30.      *
  31.      * @param string $namespace The namespace under which the token is stored in the requestStack
  32.      */
  33.     public function __construct(RequestStack $requestStackstring $namespace self::SESSION_NAMESPACE)
  34.     {
  35.         $this->requestStack $requestStack;
  36.         $this->namespace $namespace;
  37.     }
  38.     /**
  39.      * {@inheritdoc}
  40.      */
  41.     public function getToken(string $tokenId): string
  42.     {
  43.         $session $this->getSession();
  44.         if (!$session->isStarted()) {
  45.             $session->start();
  46.         }
  47.         if (!$session->has($this->namespace.'/'.$tokenId)) {
  48.             throw new TokenNotFoundException('The CSRF token with ID '.$tokenId.' does not exist.');
  49.         }
  50.         return (string) $session->get($this->namespace.'/'.$tokenId);
  51.     }
  52.     /**
  53.      * {@inheritdoc}
  54.      */
  55.     public function setToken(string $tokenIdstring $token)
  56.     {
  57.         $session $this->getSession();
  58.         if (!$session->isStarted()) {
  59.             $session->start();
  60.         }
  61.         $session->set($this->namespace.'/'.$tokenId$token);
  62.     }
  63.     /**
  64.      * {@inheritdoc}
  65.      */
  66.     public function hasToken(string $tokenId): bool
  67.     {
  68.         $session $this->getSession();
  69.         if (!$session->isStarted()) {
  70.             $session->start();
  71.         }
  72.         return $session->has($this->namespace.'/'.$tokenId);
  73.     }
  74.     /**
  75.      * {@inheritdoc}
  76.      */
  77.     public function removeToken(string $tokenId): ?string
  78.     {
  79.         $session $this->getSession();
  80.         if (!$session->isStarted()) {
  81.             $session->start();
  82.         }
  83.         return $session->remove($this->namespace.'/'.$tokenId);
  84.     }
  85.     /**
  86.      * {@inheritdoc}
  87.      */
  88.     public function clear()
  89.     {
  90.         $session $this->getSession();
  91.         foreach (array_keys($session->all()) as $key) {
  92.             if (str_starts_with($key$this->namespace.'/')) {
  93.                 $session->remove($key);
  94.             }
  95.         }
  96.     }
  97.     /**
  98.      * @throws SessionNotFoundException
  99.      */
  100.     private function getSession(): SessionInterface
  101.     {
  102.         return $this->requestStack->getSession();
  103.     }
  104. }