Веб-сайты 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;
}
Что я пропустил?
С уважением.
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 .
Для совместного использования сеанса между веб-приложением и websocket оба должны быть запущены в одном домене и на одном порту, в противном случае файл cookie не будет отправлен браузером
Web app: http://www.exemple.com:80
Websocket: ws://ws.exemple.com:80
И файл cookie должен быть настроен для домена exemple.com (без какого-либо поддомена)
Похоже, что ваша конфигурация настроена на порт 8081 для websocket, когда ваш веб-сервер работает на порту 8000
Надеюсь, это поможет