Подтвердить что ты не робот

Symfony2: как вручную вывести пользователя вручную в контроллер?

Я хотел бы сделать что-то вроде этого в контроллере для выхода из системы:

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

Ответ 1

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

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

Устаревшее 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();

Предупреждение

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

Пожалуйста, рассмотрите расширенное решение, если вы используете, помните мне функциональность: fooobar.com/questions/142583/...

Ответ 2

Мы должны установить пользователя как анонимного пользователя при выходе из системы. Тогда мы можем использовать $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();

Ответ 3

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

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

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

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

app/console router:match /logout

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

:)

Ответ 4

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

    $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);
    }