src/EventSubscriber/AuthCookieSubscriber.php line 84

Open in your IDE?
  1. <?php
  2. /**
  3.  * User: Quentin
  4.  * Date: 06/07/2020
  5.  * Time: 22:57
  6.  */
  7. namespace App\EventSubscriber;
  8. use App\Entity\User;
  9. use App\Services\RemoteAuthService;
  10. use App\Services\UserService;
  11. use Doctrine\ORM\EntityManagerInterface;
  12. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  13. use Symfony\Component\HttpFoundation\Cookie;
  14. use Symfony\Component\HttpKernel\Event\RequestEvent;
  15. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  16. use Symfony\Component\HttpKernel\KernelEvents;
  17. class AuthCookieSubscriber implements EventSubscriberInterface {
  18.     protected $ticket;
  19.     
  20.     /**
  21.      * @var RemoteAuthService
  22.      */
  23.     private $remoteAuth;
  24.     
  25.     protected $mustClearCookie false;
  26.     
  27.     /**
  28.      * @var EntityManagerInterface
  29.      */
  30.     private $entityManager;
  31.     
  32.     /**
  33.      * @var UserService
  34.      */
  35.     private $userService;
  36.     public function __construct(RemoteAuthService $remoteAuthEntityManagerInterface $entityManagerUserService $userService) {
  37.         $this->remoteAuth $remoteAuth;
  38.         $this->entityManager $entityManager;
  39.         $this->userService $userService;
  40.     }
  41.     public static function getSubscribedEvents() {
  42.         return [
  43.             KernelEvents::REQUEST => 'onKernelRequest',
  44.             KernelEvents::RESPONSE => 'onKernelResponse',
  45.         ];
  46.     }
  47.     public function onKernelRequest(RequestEvent $event) {
  48.         $ticketGrantingTicket $event->getRequest()->cookies->get(RemoteAuthService::COOKIE_NAME);
  49.         if (is_null($ticketGrantingTicket)) {
  50.             return;
  51.         }
  52.         
  53.         if ($this->userService->getUser() !== null) {
  54.             return;
  55.         }
  56.         $ticketGrantingTicket trim($ticketGrantingTicketRemoteAuthService::COOKIE_WRAP_CHAR);
  57.         
  58.         $userData $this->remoteAuth->tradeTGTForUserData($ticketGrantingTicket);
  59.         if (is_string($userData)) {
  60.             $this->mustClearCookie true;
  61.             return;
  62.         }
  63.         /** @var User|null $user */
  64.         $user $this->entityManager->getRepository(User::class)->findOneByRemoteId($userData->remoteId);
  65.         if (is_null($user)) {
  66.             $this->mustClearCookie true;
  67.             return;
  68.         }
  69.         
  70.         $this->userService->authenticate($user$event->getRequest());
  71.         $user->setLastConnectedAt(new \DateTime());
  72.         $this->entityManager->flush();
  73.     }
  74.     public function onKernelResponse(ResponseEvent $event) {
  75.         if ($this->mustClearCookie) {
  76.             $this->remoteAuth->setCookie($event->getResponse(), null);
  77.         }
  78.     }
  79. }