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

Php Symfony在注销事件之前重定向用户,php,symfony,saml-2.0,symfony-3.4,Php,Symfony,Saml 2.0,Symfony 3.4,我有一个symfony3.4项目(如果有帮助,可以使用FosUser),它有多种登录类型(local、Oauth2、ldap),所有的注销(最终)都是通过默认的注销方法从本地用户处处理的 然而,在SAML协议中,注销需要重定向到Idp(身份提供者,这里是Azure AD)并获得成功响应,然后在本地注销用户 在我的在线搜索中,仅此5.1 symfony(而不是3.4)文档说明了如何在注销事件发生之前而不是之后触发某些代码(如注销侦听器或订阅服务器) 在注销事件发生之前,3.4 Symfony项目如

我有一个symfony3.4项目(如果有帮助,可以使用FosUser),它有多种登录类型(local、Oauth2、ldap),所有的注销(最终)都是通过默认的注销方法从本地用户处处理的

然而,在SAML协议中,注销需要重定向到Idp(身份提供者,这里是Azure AD)并获得成功响应,然后在本地注销用户

在我的在线搜索中,仅此5.1 symfony(而不是3.4)文档说明了如何在注销事件发生之前而不是之后触发某些代码(如注销侦听器或订阅服务器)


在注销事件发生之前,3.4 Symfony项目如何检查用户的登录类型是否为saml?如果是saml,我可以将他重定向到Idp(并返回到自定义路由)并继续该过程吗?

由于@Jakumi注释,我在默认设置之前成功运行了侦听器。首先,我必须在services.yaml中注册优先级高于7的侦听器

App\EventListener\BeforeLogoutListener:
  tags:
    - { name: kernel.event_listener, event: kernel.request, priority: 8 }
在这里,我无法使用appHelper或Security获取当前用户,因为此侦听器在Security/Http/Firewall之前运行。因此,我停止事件传播设置new response,将用户重定向到自定义注销路由器,然后在用户中执行验证逻辑

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

}

我希望我能从那些努力做到这一点的人那里省下几天的时间。

在3.4(可能以后也会如此)中,每个防火墙都会使用包含大量侦听器的FirewallMap进行初始化。其中之一是默认情况下处理注销的。一种方法是添加您自己的具有更高优先级的注销侦听器,并且在设置事件响应时,您可以防止以后的侦听器执行操作,从而有效地覆盖默认的注销侦听器。否则,您可能还可以替换logoutlistener(或装饰),谢谢@Jakumi的回答。注销侦听器也是我的第一个想法。我用它来写我的动作日志实体。正如我在问题中所说,侦听器仅在事件结束后运行,而不是之前,因为我要求SAML注销,所以您不能在侦听器中重定向,因为这将触发错误。您是否查看了我链接的注销侦听器?因为这会导致注销。它处理不同的事件,在此类事件上,您可以设置停止事件传播的响应(例如重定向响应)。那个特定的注销侦听器实际上就是这样做的。享受。再次感谢你的回答@Jakumi,是的,这门课似乎正是我所需要的。我整天都在尝试使用这个监听器,但我不知道如何使用它。你能告诉我怎么做吗?我需要扩展这个类,需要做一个新的服务还是以某种方式覆盖这个服务?如何在完成登录请求之前触发我的自定义逻辑?提前谢谢。听众都有优先权。您的侦听器应该位于注销侦听器之前,并且应该类似于它侦听相同的事件,检查用户是否请求相同的注销路径(与注销侦听器一样),以某种方式发现用户是如何登录的(可能是会话cookie或db中的某个值?)然后才为您的外部注销设置重定向响应。这不是你的个人编码员,所以你应该自己尝试,显然你已经尝试过了,然后发布你的代码,描述什么不起作用(可能在一个新问题中),然后继续。