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

b4lqfgs4  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(111)

我有一个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的文档解释了如何在注销事件发生之前而不是之后触发一些代码(像注销侦听器或订阅者那样)。
Symfony 3.4项目如何在注销事件发生之前检查用户的登录类型是否为saml?如果是saml,我可以将他重定向到Idp(并返回到自定义路由)并继续该过程吗?

ws51t4hk

ws51t4hk1#

多亏了@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')));
    }

}

我希望我能从一个挣扎着做同样事情的人那里省下几天时间。

i7uq4tfw

i7uq4tfw2#

在Symfony4.4之后,将GetResponseEvent替换为RequestEvent

相关问题