Отвечу сам на свой вопрос. Вот мое решение.
Создаем файл EventListener.php
namespace project\UserBundle\EventListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
class UserListener {
protected $container;
public function __construct($container = null) {
if (!is_null($container)) {
$this->container = $container;
}
}
public function onAuthenticationSuccess() {
$user = $this->container->get('security.token_storage')->getToken()->getUser();
$x = md5(rand(0, 1000));
$user->setToken($x);
$em = $this->container->get('doctrine')->getManager();
$em->persist($user);
$em->flush();
$cookie = new Cookie('_token', $x, time() + 3600 * 24 * 7);
$response = new Response();
$response->headers->setCookie($cookie);
$response->send();
}
public function onKernelRequest(GetResponseEvent $event) {
$user = $this->container->get('security.token_storage')->getToken()->getUser();
if (!is_object($user)) {
return;
}
$x = $user->getToken();
$request = $this->container->get('request_stack')->getCurrentRequest();
$cookies = $request->cookies->all();
if (!isset($cookies['_token']) || $cookies['_token'] !== $x) {
$this->container->get('request')->getSession()->invalidate();
$this->container->get('security.context')->setToken(null);
$event->setResponse($this->container->get('templating')->renderResponse('UserBundle:Login:login2.html.twig', array(), null));
}
}
}
При каждом входе записываем в таблицу USER уникальный токен и точно такое же в куки. А потом в onKernelRequest() проверяем соответствует ли кука данным из таблицы. Если нет, то происходит разлогинивание.