注销后如何停止 Symfony 重定向

How to stop Symfony redirecting after logout

默认的 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

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

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

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

返回到您的问题(来自下面的博客 post):

The Symfony\Component\Security\Http\Event\LogoutEvent object received by the listener contains useful methods such as getToken() (to get the security token of the session), getRequest() and setResponse().

后面的会帮到你。这意味着你可以 return 任何你想要的而不是默认的 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