vendor/nellapp/sdk-bundle/src/Auth/EventSubscriber/LogoutSubscriber.php line 39

Open in your IDE?
  1. <?php
  2. /*
  3. * This file is part of the nellapp-core package.
  4. *
  5. * (c) Benjamin Georgeault
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Nellapp\Bundle\SDKBundle\Auth\EventSubscriber;
  11. use Nellapp\Bundle\SDKBundle\Auth\Entity\UserInterface;
  12. use Nellapp\Bundle\SDKBundle\Routing\UrlGeneratorInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  16. use Symfony\Component\Security\Http\Event\LogoutEvent;
  17. /**
  18. * Class LogoutSubscriber
  19. *
  20. * @author Benjamin Georgeault
  21. */
  22. class LogoutSubscriber implements EventSubscriberInterface
  23. {
  24. public function __construct(
  25. private UrlGeneratorInterface $urlGenerator,
  26. ) {}
  27. public static function getSubscribedEvents(): array
  28. {
  29. return [
  30. LogoutEvent::class => 'logout',
  31. ];
  32. }
  33. public function logout(LogoutEvent $event): void
  34. {
  35. $request = $event->getRequest();
  36. if (null === $this->getUser($event->getToken()) && !$request->hasSession()) {
  37. return;
  38. }
  39. // If session expired, prevent redirect.
  40. $bag = $request->getSession()->getMetadataBag();
  41. if (time() > $bag->getLastUsed() + $bag->getLifetime() ) {
  42. return;
  43. }
  44. $redirect = new RedirectResponse($this->urlGenerator->generate('core', 'app_logout'));
  45. if ((null !== $previousResponse = $event->getResponse()) && $previousResponse instanceof RedirectResponse) {
  46. $redirect->setTargetUrl(
  47. $redirect->getTargetUrl() . '?target=' . $previousResponse->getTargetUrl(),
  48. );
  49. }
  50. $event->setResponse($redirect);
  51. }
  52. private function getUser(?TokenInterface $token): ?UserInterface
  53. {
  54. if (($user = $token?->getUser()) instanceof UserInterface) {
  55. return $user;
  56. }
  57. return null;
  58. }
  59. }