Ответы пользователя по тегу Symfony
  • Symfony2 + Кастомная авторизация. Как?

    Может про это забыли.
    # app/config/services.yml
    services:
        wsse.security.authentication.provider:
            class: AppBundle\Security\Authentication\Provider\WsseProvider
            arguments:
                - '' # User Provider
                - '%kernel.cache_dir%/security/nonces'
            public: false
    
        wsse.security.authentication.listener:
            class: AppBundle\Security\Firewall\WsseListener
            arguments: ['@security.token_storage', '@security.authentication.manager']
            public: false

    Я наоборот вначале свою авторизацию написал, а потом FOSUserBundle изучал.
    Ответ написан
    Комментировать
  • Как в Symfony 2 сделать авторизацию не более чем на одном устройстве?

    @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() проверяем соответствует ли кука данным из таблицы. Если нет, то происходит разлогинивание.
    Ответ написан