Веб-сайты Symfony: Зарегистрированный пользователь всегда возвращает анонимное имя в теме


Я наконец нашел проблему, но не могу ее хорошо объяснить. Веб-сервер и сервер Websocket работают на "127.0.0.1:xyz" каждый. Когда я захожу на свой веб-сайт с "127.0.0.1:xy/app_dev.php/учетная запись", все работает, файлы cookie отправляются, считываются, и пользователь, вошедший в систему, возвращается клиентским манипулятором.

Когда я захожу на свой веб-сайт с "localhost:xy/app_dev.php/учетная запись", я всегда возвращаю анонимного пользователя, и файлы cookie не отправляются. Может кто-нибудь объяснить это мне, пожалуйста, - и это тоже повлияет на рабочий режим? (например, пользователь также может подключиться к IP-адресу веб-сайта - и тогда это приведет меня к той же проблеме, не так ли?)

Этот вопрос связан с этим . (Symfony 2.7)

Я внедрил пакет Gos Websocket и теперь могу отправлять сообщения в режиме реального времени на каналы, на которые пользователи могут подписаться. Проблема в настоящее время заключается в том, что у меня нет доступа к текущему зарегистрированному пользователю в рамках моего класса Темы уведомлений. Я уже перепробовал все, что было подписано в соответствующем посте, на который я ссылался.

В настоящее время я добавляю "@security.token_storage" в свою тему, но, как я уже сказал, поведение одинаково и для других подходов. Я думаю, что это проблема "cookie/домена", файлы cookie не отправляются на сервер websocket. Вот моя конфигурация:

Веб-сервер Symfony/php: "Сервер, работающий на http://127.0.0.1:8000"

Конфигурация веб-сайта Gos.yml:

gos_web_socket:
  server:
    port: 8081        #The port the socket server will listen on
    host: 127.0.0.1   #The host ip to bind to
    router:
      resources:
        - @MessageBundle/Resources/config/pubsub/routing.yml
  client:
    firewall: main
    session_handler: @session.handler.pdo
  pushers:
    zmq:
        host: 127.0.0.1
        port: 5555
        persistent: true
        protocol: tcp

@ сеанс.обработчик.pdo в сервисах.yml:

pdo:
      class: PDO
      arguments:
          dsn: mysql:host=%database_host%;port=%database_port%;dbname=%database_name%
          user: %database_user%
          password: %database_password%
      calls:
          - [ setAttribute, [3, 2] ] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION

session.handler.pdo:
      class:     Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler
      arguments: [@pdo, {lock_mode: 0}]

Сеанс платформы, настроенный для использования обработчика pdo:

session:
  # handler_id set to null will use default session handler from php.ini
  handler_id:  session.handler.pdo

Часть JavaScript для подключения клиента к websocket:

var webSocket = WS.connect("ws://127.0.0.1:8000");

webSocket.on("socket/connect", function(session){

    session.subscribe("account/notification", function(uri, payload){
        console.log("Received message", payload.msg);
    });

});

Это моя конфигурация, хранилище токенов вводится в службу для темы уведомлений. Метод "OnSubscribe" темы получает удар, но пользователь остается анонимным, даже если я вошел в систему:

public function onSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request)
{
    // always returns anonym
    dump($this->tokenStorage->getToken()->getUser());die;
}

Что я пропустил?

С уважением.

Author: Community, 2015-09-30

2 answers

Как теперь ясно, объяснение кроется в ограничениях HTTP-файлов cookie. Более подробную информацию можно найти здесь: http://www.cookiecentral.com/faq/#4.3

"Основное ограничение на извлечение файлов cookie заключается в том, что вы можете извлекать только те файлы cookie, которые действительны для документа, в котором находится ваш скрипт. То есть сценарий на www.myserver.com не удается прочитать файлы cookie из www.yourserver.com ."

Кроме того, я предлагаю вам обеспечить запуск вашего сервера websocket в домене "localhost" для доступа к вашему веб-сайт с использованием "localhost". При этом оба домена по-прежнему будут соответствовать друг другу.

В качестве вопроса для себя я никогда не проверял, вызывает ли доступ к веб-сайту по его адресу (127.0.0.1) и запуск сервера websocket на "локальном хосте" ту же проблему. В любом случае, чтобы ответить вам, нет, это не должно воспроизводиться один раз в prod, как только у вас будет правильный домен (не ip).

Однако ответ Томаса неверен, вы не можете запускать оба сервера на одном порту, так как это определение для портов (один порт, одна служба/процесс): https://en.wikipedia.org/wiki/Port_%28computer_networking%29 .

 2
Author: wr0ng.name, 2015-10-01 21:34:08

Для совместного использования сеанса между веб-приложением и websocket оба должны быть запущены в одном домене и на одном порту, в противном случае файл cookie не будет отправлен браузером

Web app: http://www.exemple.com:80
Websocket: ws://ws.exemple.com:80

И файл cookie должен быть настроен для домена exemple.com (без какого-либо поддомена)

Похоже, что ваша конфигурация настроена на порт 8081 для websocket, когда ваш веб-сервер работает на порту 8000

Надеюсь, это поможет

 0
Author: Thomas Klein, 2015-10-01 11:50:14