<?php
namespace FlexApp\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use FlexApp\Repository\RefreshTokenRepository;
use FlexApp\Service\CurrentUserProvider;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Security\Http\Event\LogoutEvent;
use WebBundle\Helper\ServerHelper;
class LogoutSubscriber implements EventSubscriberInterface
{
/** @required */
public CurrentUserProvider $currentUserProvider;
/** @required */
public EntityManagerInterface $entityManager;
/** @required */
public RefreshTokenRepository $refreshTokenRepository;
public function onLogoutEvent(LogoutEvent $event)
{
$response = $event->getResponse();
$token = hash('sha256', uniqid());
$cookie = new Cookie('token', $token, time() + 94608000, '/');
$_SESSION['token'] = $token;
$response->headers->setCookie($cookie);
$this->logoutOnNewSite();
}
public static function getSubscribedEvents()
{
return [
LogoutEvent::class => 'onLogoutEvent',
];
}
private function logoutOnNewSite()
{
$user = $this->currentUserProvider->getUser();
if (!$user) {
return;
}
$user->setSecurityField(md5(uniqid()));
$refreshTokens = $this->refreshTokenRepository->findBy(['username' => $user->getEmail()]);
foreach ($refreshTokens as $refreshToken) {
$this->entityManager->remove($refreshToken);
}
$this->entityManager->flush();
}
}