Как удаленно очистить cookie Remember_me для другого пользователя в Symfony2?

Итак, у меня есть это базовое веб-приложение с защищенной областью бэк-офиса, доступное только одному пользователю (мне). Я хочу иметь возможность удаленно выходить из сеансов на других устройствах (на другом компьютере, на моем телефоне и т. Д.).

Таким образом, я реализовал session Таблица:

CREATE TABLE IF NOT EXISTS `session` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`session_token` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`login_date` datetime NOT NULL,
`user_agent` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`ip` varchar(15) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_D044D5D4844A19ED` (`session_token`),
KEY `IDX_D044D5D4A76ED395` (`user_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=15 ;

наряду с правильными обработчиками:

LoginListener

<?php

namespace AppBundle\Event\Listener;

// use ...

class LoginListener implements EventSubscriberInterface
{
protected $em;

function __construct(EntityManager $em)
{
$this->em = $em;
}

public static function getSubscribedEvents()
{
return array(
SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin',
);
}

public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
{
$user = $event->getAuthenticationToken()->getUser();
$currentSession = $event->getRequest()->getSession();$session = (new \AppBundle\Entity\Admin\Session)
->setUser($user)
->setSessionToken($currentSession->getId())
;

$this->em->persist($session);
$this->em->flush();
}
}

LogoutListener

<?php

namespace AppBundle\Event\Listener;

// use ...

class LogoutListener implements LogoutSuccessHandlerInterface {

private $tokenStorage;
private $router;
private $em;

public function __construct(TokenStorage $tokenStorage, Router $router, EntityManager $em)
{
$this->tokenStorage = $tokenStorage;
$this->router = $router;
$this->em = $em;
}

public function onLogoutSuccess(Request $request)
{
$session = $this
->em
->getRepository('AppBundle:Admin\Session')
->findOneBySessionToken($request->getSession()->getId());

$this->em->remove($session);
$this->em->flush();

$response = new RedirectResponse($this->router->generate('blog_home'));
$response->headers->clearCookie('remember_me');
$response->headers->clearCookie('session');
$response->send();

$request->getSession()->invalidate();

return $response;
}
}

Это хорошо работает при обработке входа и выхода из системы. Запись корректно вставляется при входе в систему и удаляется при выходе из системы. Теперь я могу сделать следующее для удаленного аннулирования сессии:

public function clearSessionsAction(Request $request)
{
$session = new Session();
session_id('<whatever remote session id found in session table>');
$session->invalidate();

return $this->redirect($this->generateUrl('blog_home'));
}

Тем не менее, это не сработает если я установил флажок «Запомнить меня» при входе в систему для удаленных сессий.

Поэтому мой вопрос таков: возможно ли очистить cookie «Remember_me» для другого пользователя, кроме текущего?

Конечно, я пытался $response->headers->clearCookie('remember_me'); но это заканчивается ток сессия.

1

Решение

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

Правильный способ реализации этого заключается в использовании PdoSessionHandler чтобы фактически сохранить ваши сеансы в базе данных SQL, а затем, если вы хотите удаленно выйти из системы, вы можете просто удалить сеанс в базе данных.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]