Не могу программно закрыть сессию пользователю. Это нужно если пароль или "блокировка" были изменены.
Пробовал и так
$this->tokenStorage->setToken(null);
(не происходит ниче)
и так
$request->getSession()->invalidate(1);
(Пишет, что нельзя изменить активную сессию)
и даже так
SecurityController::logout();
(выбрасывает исключение)
Пробовал так же перенести хранилище сессий в базу и удалять их оттуда. Просто появляются новые.
Я понимаю, что похоже, проверяю где-то между "успешно проверено" и записью сессий и он просто записывает новые. Куда же правильно засунуть свои эти проверки так, чтобы я мог делать программный логаут?
Flying, у симфони есть компонент, security. В его комплекте поставляется авторизация. Я естественно её закрутил в свой проект. Вот только теперь не знаю, как "выкинуть" пользователя, если я его, например, заблокировал. Как не пустить при авторизации через форму логина - с этим справился, здесь было легко.
А вот теперь как бы закончить сессию "принудительно" - вообще непонятно.
Ваня Самойлов, О том как принудительно сделать logout пользователю прямо написано в документации Symfony. Вам необходимо определить route для logout в конфигурации и просто сделать redirect на этот route.
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
private function closeCurrentSession(TokenStorageInterface $tokenStorage, Request $request)
{
$token = new AnonymousToken('default', 'anon.');
$tokenStorage->setToken($token);
$request->getSession()->invalidate();
throw new AccessDeniedException();
}