Symfony 在注销事件之前重定向用户

Symfony redirect user BEFORE logout event

我有一个具有多种登录类型(本地、Oauth2、ldap)的 Symfony 3.4 项目(如果有帮助,则使用 FosUser),所有注销(最后)都是通过默认注销方法从本地用户处理的。

然而,在 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(并返回自定义路由)并继续该过程吗?

感谢@Jakumi 的评论,我设法 运行 在默认 LogoutListener 之前成为一个侦听器。首先,我必须在 services.yaml 中注册一个优先级高于 7

的监听​​器
App\EventListener\BeforeLogoutListener:
  tags:
    - { name: kernel.event_listener, event: kernel.request, priority: 8 }

这里我无法使用 appHelper 或 Security 获取当前用户,因为此侦听器 运行 在 Security/Http/Firewall 之前。所以我停止设置新响应的事件传播,将用户重定向到自定义注销路由器,然后在用户中执行我的验证逻辑。

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')));
    }

}

我希望我能从那些正在努力做同样事情的人那里节省几天时间。