注销后如何停止 Symfony 重定向

Posted

技术标签:

【中文标题】注销后如何停止 Symfony 重定向【英文标题】:How to stop Symfony redirecting after logout 【发布时间】:2022-01-20 18:53:21 【问题描述】:

默认的 Symfony 行为是在注销后重定向到 '/'。 我不需要 Symfony 的任何重定向,因为它是一个 api 应用程序。

就像在登录期间 Symfony 控制进行身份验证,但仍然运行登录控制器以执行进一步的操作。在这种情况下,这也是注销的理想选择。

security.yaml

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            lazy: true
            provider: app_user_provider

            json_login:
                check_path: app_login
                username_path: email
                password_path: password

            logout:
                path: app_logout

来自 Symfony 文档的 src/Controller/SecurityController.php

    /**
     * @Route("/logout", name="app_logout", methods="GET")
     */
    public function logout(): void
    
        // controller can be blank: it will never be called!
        throw new \Exception('Don\'t forget to activate logout in security.yaml');
    

【问题讨论】:

【参考方案1】:

您可以编写自定义注销处理程序。实际上,在 symfony 5.1 中引入了一种新的方法。基本上,现在您可以在全局范围内或为某些特定防火墙注册事件侦听器,并在此人注销后执行任何操作。

回到您的问题(来自下面的博文):

Symfony\Component\Security\Http\Event\LogoutEvent 对象 侦听器接收到的包含有用的方法,例如 getToken() (获取会话的安全令牌),getRequest() 和 setResponse().

后面会帮助你。这意味着您可以通过为事件设置新的响应对象来返回您想要的任何东西,而不是默认的RedirectResponse

services.yaml:

services:
    App\EventListener\CustomLogoutListener:
        tags:
            - name: 'kernel.event_listener'
              event: 'Symfony\Component\Security\Http\Event\LogoutEvent'
              dispatcher: security.event_dispatcher.main
              method: onLogout

还有你的听众:

namespace App\EventListener;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Security\Http\Event\LogoutEvent;

class CustomLogoutListener

    public function onLogout(LogoutEvent $logoutEvent): void
    
        $logoutEvent->setResponse(new JsonResponse([]));
    

阅读更多:Simpler logout customization

【讨论】:

感谢您提供完整的答案,看起来它可以工作,我会在接下来的几天里使用它。我猜这将是答案。我真的希望有一个像target: null 这样的内置解决方案来取消重定向。 @Bradmage 这几乎是不可能的,因为您至少需要某种回应。所以这种target: null 的行为将是不确定的。 我认为有误会,我对target: null 的意图是强制它使用app_logout 方法来处理响应。您的解决方案完全符合我的要求,只是完成相同工作的漫长道路。 App\EventListener\CutomLogoutListener:有错字,但我无法编辑一个字符。 @Bradmage 已修复

以上是关于注销后如何停止 Symfony 重定向的主要内容,如果未能解决你的问题,请参考以下文章

Symfony - 如何将用户重定向到登录后访问的最后一个页面?

如何配置在Django中注销后重定向到哪里?

如何配置在Django中注销后重定向到哪里?

登录和注销后如何重定向 - laravel 5

如何覆盖注销后重定向网址

如何在 Symfony 2 中 login_check 后禁用重定向