Symfony2: как вручную выйти из системы в контроллере? - PullRequest
43 голосов
/ 24 июня 2011

Я хотел бы сделать что-то подобное в контроллере, чтобы выйти из системы:

$user = $this->get('security.context')->getToken()->getUser();
$user->logOut();

Ответы [ 4 ]

75 голосов
/ 25 июня 2011

Выход из системы в Symfony2 обрабатывается так называемым обработчиком выхода из системы, который является просто списком, который выполняется, когда шаблон URL соответствует конфигурации безопасности, т.е.если URL, скажем, /logout, то этот слушатель выполняется.Есть два встроенных обработчика выхода из системы:

  1. CookieClearingLogoutHandler , который просто очищает все куки.
  2. SessionLogoutHandler , который делает недействительным сеанс

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

Legacy Symfony

$this->get('security.context')->setToken(null);
$this->get('request')->getSession()->invalidate();

Symfony 2.6

$this->get('security.token_storage')->setToken(null);
$this->get('request')->getSession()->invalidate();

Warning

Это будет работать только тогда, когда запомнить меня функциональность отключена.В другом случае пользователь снова войдет в систему с помощью cookie-файла Запомнить меня со следующим запросом.

Пожалуйста, рассмотрите расширенное решение, если вы используете функцию запомнить меня: https://stackoverflow.com/a/28828377/1056679

11 голосов
/ 06 марта 2014

Отмена сеанса пользователя может привести к нежелательным результатам. Брандмауэр Symfony имеет прослушиватель, который всегда проверяет и обновляет токен пользователя. Вы можете просто сделать перенаправление на маршрут выхода по умолчанию, который вы указали в firewall.yml

В контроллере вы можете сделать это:

$this->redirect( $this->generateUrl( 'your_logout_url' ) );

если вы не знаете название маршрута выхода из системы. Вы можете проверить это в консоли:

app/console router:match /logout

эта команда даст вам название маршрута, который вам понадобится.

:)

9 голосов
/ 04 января 2014

Мы должны установить пользователя как анонимного пользователя при выходе.Тогда мы можем использовать
$token->getUser()->getRoles(); в контроллере или {% if is_granted('ROLE_USER') %} в шаблоне ветки.

use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
...
//$providerKey = $this->container->getParameter('fos_user.firewall_name');
$token = new AnonymousToken($providerKey, 'anon.');
$this->get('security.context')->setToken($token);
$this->get('request')->getSession()->invalidate();
1 голос
/ 01 апреля 2015

Если для вашего сайта включена функция запомнить меня, вы также должны очистить cookie-файл запомнить:

    $this->get('security.context')->setToken(null);
    $this->get('request')->getSession()->invalidate();

    $response = new RedirectResponse($this->generateUrl('dn_send_me_the_bundle_confirm', array(
                'token' => $token
                )));
    // Clearing the cookies.
    $cookieNames = [
        $this->container->getParameter('session.name'),
        $this->container->getParameter('session.remember_me.name'),
    ];
    foreach ($cookieNames as $cookieName) {
        $response->headers->clearCookie($cookieName);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...