Как в Symfony 2 сделать авторизацию не более чем на одном устройстве?

Как в Symfony 2 сделать авторизацию только на одном устройстве? Когда пользователь входит с одного компьютера, необходимо разлогинить его на других компьютерах. Как это лучше сделать?
  • Вопрос задан
  • 387 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
symfony.com/doc/current/components/http_foundation...

Ну либо запоминайте токен выдаваемый при авторизации и проверяйте совпадает ли токен хранящийся в сессии и тот что вы запомнили.
Ответ написан
@CooperIII Автор вопроса
Отвечу сам на свой вопрос. Вот мое решение.
Создаем файл 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() проверяем соответствует ли кука данным из таблицы. Если нет, то происходит разлогинивание.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы