<?php
/**
* User: Quentin
* Date: 06/07/2020
* Time: 22:57
*/
namespace App\EventSubscriber;
use App\Entity\User;
use App\Services\RemoteAuthService;
use App\Services\UserService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class AuthCookieSubscriber implements EventSubscriberInterface {
protected $ticket;
/**
* @var RemoteAuthService
*/
private $remoteAuth;
protected $mustClearCookie = false;
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var UserService
*/
private $userService;
public function __construct(RemoteAuthService $remoteAuth, EntityManagerInterface $entityManager, UserService $userService) {
$this->remoteAuth = $remoteAuth;
$this->entityManager = $entityManager;
$this->userService = $userService;
}
public static function getSubscribedEvents() {
return [
KernelEvents::REQUEST => 'onKernelRequest',
KernelEvents::RESPONSE => 'onKernelResponse',
];
}
public function onKernelRequest(RequestEvent $event) {
$ticketGrantingTicket = $event->getRequest()->cookies->get(RemoteAuthService::COOKIE_NAME);
if (is_null($ticketGrantingTicket)) {
return;
}
if ($this->userService->getUser() !== null) {
return;
}
$ticketGrantingTicket = trim($ticketGrantingTicket, RemoteAuthService::COOKIE_WRAP_CHAR);
$userData = $this->remoteAuth->tradeTGTForUserData($ticketGrantingTicket);
if (is_string($userData)) {
$this->mustClearCookie = true;
return;
}
/** @var User|null $user */
$user = $this->entityManager->getRepository(User::class)->findOneByRemoteId($userData->remoteId);
if (is_null($user)) {
$this->mustClearCookie = true;
return;
}
$this->userService->authenticate($user, $event->getRequest());
$user->setLastConnectedAt(new \DateTime());
$this->entityManager->flush();
}
public function onKernelResponse(ResponseEvent $event) {
if ($this->mustClearCookie) {
$this->remoteAuth->setCookie($event->getResponse(), null);
}
}
}