<?php
/*
* This file is part of the nellapp-core package.
*
* (c) Benjamin Georgeault
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Nellapp\Bundle\SDKBundle\Auth\EventSubscriber;
use Nellapp\Bundle\SDKBundle\Auth\Entity\UserInterface;
use Nellapp\Bundle\SDKBundle\Routing\UrlGeneratorInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
/**
* Class LogoutSubscriber
*
* @author Benjamin Georgeault
*/
class LogoutSubscriber implements EventSubscriberInterface
{
public function __construct(
private UrlGeneratorInterface $urlGenerator,
) {}
public static function getSubscribedEvents(): array
{
return [
LogoutEvent::class => 'logout',
];
}
public function logout(LogoutEvent $event): void
{
$request = $event->getRequest();
if (null === $this->getUser($event->getToken()) && !$request->hasSession()) {
return;
}
// If session expired, prevent redirect.
$bag = $request->getSession()->getMetadataBag();
if (time() > $bag->getLastUsed() + $bag->getLifetime() ) {
return;
}
$redirect = new RedirectResponse($this->urlGenerator->generate('core', 'app_logout'));
if ((null !== $previousResponse = $event->getResponse()) && $previousResponse instanceof RedirectResponse) {
$redirect->setTargetUrl(
$redirect->getTargetUrl() . '?target=' . $previousResponse->getTargetUrl(),
);
}
$event->setResponse($redirect);
}
private function getUser(?TokenInterface $token): ?UserInterface
{
if (($user = $token?->getUser()) instanceof UserInterface) {
return $user;
}
return null;
}
}