Symfony 4: Выйдите из системы на пользовательском контроллере - PullRequest
0 голосов
/ 04 февраля 2019

Я следовал руководству, чтобы приложение могло выходить из системы, просто вызывая маршрут, например / logout (через модуль безопасности, как описано в официальной документации).Это работает.

Теперь я хотел бы выйти из системы пользователя (все еще зарегистрированного через описанную в doc функцию «Запомнить меня») в моих собственных контроллерах (например, перед проверкой электронной почты, если еще один сеанс все ещеоткрыт под другим аккаунтом).Но ни один из моих методов не работает, это сводит меня с ума.Я пробовал $ session-> clear (), $ session-> invalidate (), $ request-> getSession-> clear (), $ request-> getSession-> Invalidate () и т. Д. И т. Д. Ничего не работает.

Итак, пожалуйста, мой вопрос: как вы это делаете?Как мне справиться с этим делом?Связано ли это с функцией «запомнить меня» (возможно, она управляется в другом файле cookie или чем-то еще?)?

Заранее спасибо

1 Ответ

0 голосов
/ 04 февраля 2019

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

Symfony предоставляетнесколько способов обработки аутентификации, и вам потребуются правильные LogoutHandler (s) в зависимости от ваших текущих настроек.

Решение вашей проблемы на удивление трудное, если вы не просто хотите перенаправить пользователя к пути выхода из системы.«Лучший» способ, о котором я могу думать прямо сейчас, - это имитировать запрос на выход из системы, создавая объект Request вручную, а затем отправляя с ним GetResponseEvent, так что будет запущен LogoutListener.Отправка события может иметь странные побочные эффекты, так что вы можете даже захотеть вызвать слушателя напрямую.Это может выглядеть примерно так:

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\Security\Http\Firewall\ListenerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class MyController
{
    private $kernel;
    private $logoutListener;

    public function __construct(HttpKernelInterface $kernel, LogoutListenerInterface $logoutListener)
    {
        $this->kernel = $kernel;
        $this->logoutListener = $logoutListener;
    }

    private function customLogout()
    {
        // This needs to be updated whenever the logout path in your security.yaml changes. Probably something you want to improve on.
        $request = Request::create('/logout');

        $event = new GetResponseEvent($this->kernel, $request);

        $this->logoutListener->handle($event);
    }

    public function someAction()
    {
        $this->customLogout();

        // Do whatever you want to do for your request
    }
}

Я не думаю, что это хорошее решение, поскольку вмешательство в систему безопасности само по себе опасно.Непосредственный вызов LogoutListener и передача ядра также немного ненадежны.Честно говоря, я даже не уверен на 100%, что это сработает, но это самое близкое к тому, что я мог бы предложить в качестве возможного решения вашей проблемы.Возможно, вы захотите переосмыслить то, что вы делаете, и найти альтернативный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...