Пользовательский выход из Symfony

Я пытаюсь создать функцию выхода из системы, которая при нажатии ниже (пример) перенаправляет на нужную страницу.

Пример:

  1. Если кто-то щелкнет выход с веб-сайта, начинающегося с aaa.io/user -> перейдите на aaa.io/login.
  2. Если кто-то нажимает «Выйти» с веб-сайта, начинающегося с aaa.io/dev/{id} -> перейдите на aaa.io/home/{id}

Как создать две функции выхода из системы, которые будут перенаправлять на две отдельные страницы? Я пробовал с первым примером и работает нормально. Я слышал, что мы можем сделать это с помощью брандмауэра Symfony, но не смог его получить.

#security.yaml
security:
    enable_authenticator_manager: true
    # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
    password_hashers:
        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
        App\Entity\Dimitry:
            algorithm: auto

    providers:
        app_user_provider:
            entity:
                class: App\Entity\Dimitry
                property: email
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            lazy: true
            provider: app_user_provider
            custom_authenticator: App\Security\LoginAuthenticator
            logout:
                path: app_logout
                target: app_login

//Security Controller
#[Route(path: '/login', name: 'app_login')]
    public function login(AuthenticationUtils $authenticationUtils): Response
    {
         if ($this->getUser()) {
             return $this->redirectToRoute('app_home');
         }

        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();
        // last username entered by the user
        $lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('security/login.html.twig', ['last_username' => $lastUsername, 'error' => $error]);
    }

    #[Route(path: '/logout', name: 'app_logout')]
    public function logout()
    {
        return $this->redirectToRoute('app_login');

        //throw new \LogicException('This method can be blank - it will be intercepted by the logout key on your firewall.');
    }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Метод выхода из системы никогда не вызывается, поскольку он перехватывается ключом выхода из системы на вашем брандмауэре. Таким образом, строки кода в общедоступной функции выхода из системы не будут выполнены.

ИМО, вы можете использовать события:

  1. Создайте подписчика,
  2. Подписывайтесь на LogoutEvent::class,
  3. Проанализируйте запрос, предоставленный событием выхода
  4. Используйте его, чтобы определить маршрут,
  5. Перехватите ответ, предоставленный событием выхода из системы,
  6. Используйте UrlGenerator для перенаправления пользователя,
  7. Обновите ответ, чтобы перенаправить на соответствующий маршрут

Документация предоставляет очень хороший пример, который вы можете использовать в качестве шаблона для своей логики. Ваш подписчик может быть таким:

// src/EventListener/LogoutSubscriber.php
namespace App\EventListener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;

class LogoutSubscriber implements EventSubscriberInterface
{
    public function __construct(
        private UrlGeneratorInterface $urlGenerator
    ) {
    }

    public static function getSubscribedEvents(): array
    {
        //2 - Subscribe to LogoutEvent
        return [LogoutEvent::class => 'onLogout'];
    }

    public function onLogout(LogoutEvent $event): void
    {
        // get the security token of the session that is about to be logged out
        $token = $event->getToken();

        // 3. get the current request
        $request = $event->getRequest();

        // 4. Your own logic to analyze the URL
        $route = 'homepage';//default route
        if (...) {
            $route = 'URL1';
        }
        if (...) {
            $route = 'URL2';
        }

        // 5. get the current response, if it is already set by another listener
        $response = $event->getResponse();

        // configure a custom logout response to the homepage
        $response = new RedirectResponse(
            $this->urlGenerator->generate($route),
            RedirectResponse::HTTP_SEE_OTHER
        );
        $event->setResponse($response);
    }
}

Большое спасибо @Alexandra, ты гений. Код работал великолепно, и спасибо за объяснение. Будьте благословенны.

STACK_MIN 18.01.2023 03:40

Другие вопросы по теме