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')));
}
}
我希望我能从那些正在努力做同样事情的人那里节省几天时间。
我有一个具有多种登录类型(本地、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')));
}
}
我希望我能从那些正在努力做同样事情的人那里节省几天时间。