Symfony2: jak ręcznie wylogować użytkownika w kontrolerze?

Chciałbym zrobić coś takiego w kontrolerze aby wylogować użytkownika:

$user = $this->get('security.context')->getToken()->getUser();
$user->logOut();
 41
Author: VitalyP, 2011-06-24

4 answers

Wylogowanie w Symfony2 jest obsługiwane przez tzw. logout handler, który jest po prostu listerem wykonywanym, gdy URL dopasowuje się do wzorca z konfiguracji zabezpieczeń, tj. jeśli URL jest /logout, to ten listener jest wykonywany. Istnieją dwa wbudowane mechanizmy obsługi wylogowania:

  1. CookieClearingLogoutHandler który po prostu czyści wszystkie pliki cookie.
  2. SessionLogoutHandler który unieważnia sesję
Wszystko, co musisz zrobić, to to samo, co ostatni. Ty można to osiągnąć po prostu wywołując:

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();

Ostrzeżenie

To zadziała tylko wtedy, gdy Zapamiętaj mnie funkcja jest wyłączona. W innym przypadku użytkownik zostanie ponownie zalogowany za pomocą pliku cookie remember me przy następnym żądaniu.

Proszę rozważyć rozwiązanie rozszerzone, jeśli używasz funkcji Zapamiętaj mnie: https://stackoverflow.com/a/28828377/1056679

 71
Author: Crozin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:45:38

Podczas wylogowywania musimy ustawić użytkownika jako Użytkownika anonimowego. Wtedy możemy użyć
$token->getUser()->getRoles(); w kontrolerze lub {% if is_granted('ROLE_USER') %} w szablonie gałązki.

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();
 8
Author: Yasas Rangika,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-28 16:15:44

Unieważnienie sesji użytkownika może spowodować niepożądane rezultaty. Zapora Symfony posiada detektor, który zawsze sprawdza i odświeża token użytkownika. Możesz po prostu zrobić przekierowanie do domyślnej trasy wylogowania określonej w zaporze.yml

W kontrolerze możesz to zrobić:

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

Jeśli nie znasz nazwy trasy wylogowania. Możesz to sprawdzić w konsoli:

app/console router:match /logout

To polecenie da Ci nazwę trasy, którą będziesz potrzeba.

:)

 8
Author: Francis Alvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-06 11:45:46

Jeśli funkcja rememberme jest włączona dla Twojej witryny, powinieneś również wyczyścić plik cookie rememberme:

    $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);
    }
 1
Author: pliashkou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-13 13:27:10