src/Subscriber/CSTFTokenSubscriber.php line 88

Open in your IDE?
  1. <?php
  2. /**
  3.  * CSRF Token protection event subscriber
  4.  *
  5.  * PHP version 7.4
  6.  *
  7.  * @category   App
  8.  * @package    App\Subscriber
  9.  * @author     Momcilo Radotic <m.radotic@outlook.com>
  10.  * @copyright  2021 MoravaPro
  11.  * @license    MoravaPro
  12.  */
  13. namespace App\Subscriber;
  14. use Psr\Log\LoggerInterface;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Symfony\Component\HttpKernel\Event\RequestEvent;
  18. use Symfony\Component\HttpKernel\KernelEvents;
  19. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  20. use Symfony\Component\Security\Csrf\CsrfToken;
  21. use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
  22. use Symfony\Component\Security\Csrf\TokenStorage\TokenStorageInterface;
  23. /**
  24.  * CSRF Token protection event subscriber
  25.  *
  26.  * @category   App
  27.  * @package    App\Subscriber
  28.  */
  29. class CSTFTokenSubscriber implements EventSubscriberInterface
  30. {
  31.     /**
  32.      * @var LoggerInterface
  33.      */
  34.     private LoggerInterface $logger;
  35.     /**
  36.      * @var TokenStorageInterface
  37.      */
  38.     private TokenStorageInterface $tokenStorage;
  39.     /**
  40.      * @var CsrfTokenManagerInterface
  41.      */
  42.     private CsrfTokenManagerInterface $csrfTokenManager;
  43.     /**
  44.      * CSTFTokenSubscriber constructor.
  45.      *
  46.      * @param LoggerInterface $logger
  47.      * @param TokenStorageInterface $tokenStorage
  48.      * @param CsrfTokenManagerInterface $csrfTokenManager
  49.      */
  50.     public function __construct(
  51.         LoggerInterface $loggerTokenStorageInterface $tokenStorage,
  52.         CsrfTokenManagerInterface $csrfTokenManager
  53.     ) {
  54.         $this->logger $logger;
  55.         $this->tokenStorage $tokenStorage;
  56.         $this->csrfTokenManager $csrfTokenManager;
  57.     }
  58.     /**
  59.      * {@inheritDoc}
  60.      */
  61.     public static function getSubscribedEvents() : array
  62.     {
  63.         return [
  64.             KernelEvents::REQUEST => [
  65.                 [
  66.                     'onRequest',
  67.                     10
  68.                 ]
  69.             ]
  70.         ];
  71.     }
  72.     /**
  73.      * Request event class which checks CSRF Token header
  74.      *
  75.      * @param RequestEvent $event
  76.      */
  77.     public function onRequest(RequestEvent $event) : void
  78.     {
  79.         if (!$event->isMasterRequest()) {
  80.             return;
  81.         }
  82.         if (
  83.                 $event->getRequest()->getMethod() == Request::METHOD_POST
  84.             &&  (
  85.                         preg_match('/^\/api/'$event->getRequest()->getRequestUri())
  86.                     &&  $event->getRequest()->attributes->get('_route') !== 'user_api_login'
  87.                 )
  88.         ) {
  89.             $registration_routes = ['registration_register''registration_check_email''registration_check_phone'];
  90.             $tokenId in_array($event->getRequest()->attributes->get('_route'), $registration_routes) ? 'registration-api-token' 'application-api-token';
  91.             //echo $tokenId; echo $event->getRequest()->headers->get('X-CSRF-TOKEN');
  92.             $csrfToken $event->getRequest()->headers->get('X-CSRF-TOKEN');
  93.             /*if (
  94.                     !$csrfToken
  95.                 ||  !$this->tokenStorage->getToken($tokenId)
  96.             ) {
  97.                 throw new AccessDeniedException('Mandatory CSRF Token missing');
  98.             }
  99.             $storedToken = $this->tokenStorage->getToken($tokenId);
  100.             if (
  101.                     !$storedToken
  102.                 ||  $storedToken != $csrfToken
  103.                 ||  !$this->csrfTokenManager->isTokenValid(new CsrfToken($tokenId, $csrfToken))
  104.             ) {
  105.                 throw new AccessDeniedException('Invalid CSRF Token');
  106.             }*/
  107.         }
  108.     }
  109. }