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();
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:
- CookieClearingLogoutHandler który po prostu czyści wszystkie pliki cookie.
- SessionLogoutHandler który unieważnia sesję
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
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();
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.
:)
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);
}
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