Symfony Websockets:记录的用户总是在Topic中返回匿名



我终于发现了这个问题,但无法很好地解释。Webserver和Websocket Server分别在"127.0.0.1:xyz"上运行。当我使用"127.0.0.1:xy/app_dev.php/account"访问我的网站时,一切都正常,cookie被发送、读取,登录用户由clientManipulator返回。

当我使用"localhost:sy/app_dev.php/account"访问我的网站时,我总是会收到一个匿名用户,并且不会发送cookie。有人能向我解释一下吗?这会对生产模式产生影响吗?(例如,用户也可以连接网站的IP,然后这会给我带来同样的问题,不是吗?(

这个问题与这个问题有关。(Symfony 2.7(

我已经实现了Gos-Websocket捆绑包,现在可以实时向用户可以订阅的频道发送消息。目前的问题是,我无法访问我的Notification Topic类中当前登录的用户。我已经尝试了在我链接到的相关帖子中订阅的所有内容。

目前,我正在将"@security.token_storage"注入我的主题中,但正如我所说,其他方法的行为也是一样的。我认为这是一个"cookie/域"问题,cookie没有发送到websocket服务器。这是我的配置:

Symfony/php-Webserver:"服务器运行在http://127.0.0.1:8000">

Gos websocket配置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

@session.handler.pdo in services.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:     SymfonyComponentHttpFoundationSessionStorageHandlerPdoSessionHandler
      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

连接客户端和websocket的JavaScript部分:

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;
}

我错过了什么?

谨致问候。

现在已经清楚了,解释在于HTTP cookie的限制。在此处查找更多详细信息:http://www.cookiecentral.com/faq/#4.3

"检索cookie的主要限制是,您只能检索对脚本所在文档有效的cookie。也就是说,www.myserver.com上的脚本无法从www.yourserver.com读取cookie。">

此外,我建议您确保在"localhost"域上运行您的websocket服务器,以便使用"本地主机"访问您的网站。这样做,两个领域仍将保持一致。

作为我自己的一个问题,我从未检查过通过网站地址(127.0.0.1(访问网站和让websocket服务器在"localhost"上运行是否会引发同样的问题。无论如何,为了回答你,不,这不应该在prod中复制一次,只要你有正确的域(而不是ip(。

然而,Thomas的回答是不对的,你不能在同一个端口上运行两台服务器,因为这是端口的定义(一个端口,一个服务/进程(:https://en.wikipedia.org/wiki/Port_%28computer_networking%29。

为了在web应用程序和websocket之间共享会话,两者必须在同一域和同一端口上运行,否则浏览器将不会发送cookie

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

并且cookie必须为域example.com(没有任何子域(配置

当您的网络服务器在端口8000 上运行时,您的配置似乎是为网络套接字的端口8081设置的

希望这能帮助

相关内容

  • 没有找到相关文章

最新更新