Symfony перенаправить пользователя ДО выхода из системы - PullRequest
0 голосов
/ 09 июля 2020

У меня есть проект Symfony 3.4 (с FosUser, если это помогает) с несколькими типами входа в систему (локальный, Oauth2, ldap), при котором все выходы из системы (в конце концов) обрабатываются локальным пользователем с помощью метода выхода из системы по умолчанию.

В протоколе SAML, однако, выход из системы должен происходить с перенаправлением на Idp (поставщик удостоверений, здесь Azure AD), принять ответ об успешном завершении и выйти из системы локального пользователя.

В моем онлайн-поиске только эта документация для 5.1 symfony (а не для 3.4) https://symfony.com/blog/new-in-symfony-5-1-simpler-logout-customization объясняет, как можно запустить некоторый код до того, как произойдет событие выхода, а не после (как это делает слушатель выхода из системы или подписчик).

Каким образом проект 3.4 Symfony может проверять, является ли тип входа пользователя saml или нет, ДО того, как произойдет выход из системы? Если это saml, могу ли я перенаправить его на Idp (и обратно на пользовательский маршрут) и продолжить процесс?

1 Ответ

0 голосов
/ 14 июля 2020

Благодаря комментариям @Jakumi мне удалось запустить прослушиватель до LogoutListener по умолчанию. Сначала мне нужно зарегистрировать в services.yaml слушателя с приоритетом выше 7

App\EventListener\BeforeLogoutListener:
  tags:
    - { name: kernel.event_listener, event: kernel.request, priority: 8 }

Здесь я не могу использовать appHelper или Security, чтобы получить текущего пользователя, потому что этот слушатель запускается ДО Security / Http / Firewall. Поэтому я прекращаю установку нового ответа для распространения событий, перенаправляю пользователя также на настраиваемый маршрутизатор выхода из системы и ЗАТЕМ выполняю мой лог c проверки в пользователе.

public function onkernelRequest(GetResponseEvent $requestEvent)
{
    //Get data from Database and validate this action

    if ($requestEvent->getRequest()->getPathInfo() === '/logout' &&  $isExternalLogout) {
            $requestEvent->setResponse(new RedirectResponse($this->router->generate('external_logout')));
    }

}

Я надеюсь, что сэкономил дни у кого-то, кто боролся сделать то же самое.

...