src/EventListener/KeycloakLogoutListener.php line 38

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Security\Dto\TokensBag;
  4. use App\Model\User;
  5. use App\Service\KeycloakApiService;
  6. use Psr\Log\LoggerInterface;
  7. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpFoundation\RedirectResponse;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  12. use Symfony\Component\Security\Http\Event\LogoutEvent;
  13. class KeycloakLogoutListener implements EventSubscriberInterface
  14. {
  15.     private ParameterBagInterface $param;
  16.     private LoggerInterface $logger;
  17.     private KeycloakApiService $keycloakApiService;
  18.     private TokenStorageInterface $tokenStorage;
  19.     private UrlGeneratorInterface $urlGenerator;
  20.     private string|bool $vistoryRedirect;
  21.     private string $mcotPortailRedirect;
  22.     public function __construct(
  23.         UrlGeneratorInterface $urlGenerator,
  24.         TokenStorageInterface $tokenStorage,
  25.         KeycloakApiService $keycloakApiService,
  26.         LoggerInterface $logger,
  27.     ) {
  28.         $this->urlGenerator $urlGenerator;
  29.         $this->tokenStorage $tokenStorage;
  30.         $this->keycloakApiService $keycloakApiService;
  31.         $this->logger $logger;
  32.     }
  33.     public function logoutFromOidcProvider(LogoutEvent $event): void
  34.     {
  35.             $token $this->tokenStorage->getToken();
  36.             $user $token->getUser();
  37.             if (!$user instanceof User) {
  38.                 return;
  39.             }
  40.             $tokens $token->getAttribute(TokensBag::class);
  41.             if (null === $tokens) {
  42.                 throw new \LogicException(sprintf('%s token attribute is empty'TokensBag::class));
  43.             }
  44.             $this->logger->info("***** Keycloak logout *****");
  45.             $this->keycloakApiService->logout($tokens->getRefreshToken());
  46.             $redirect $this->urlGenerator->generate('login');
  47.             $event->setResponse(new RedirectResponse($redirect));
  48.     }
  49.     public static function getSubscribedEvents(): array
  50.     {
  51.         return [LogoutEvent::class => 'logoutFromOidcProvider'];
  52.     }
  53. }