代码之家  ›  专栏  ›  技术社区  ›  user3746259

Websockets控制用户访问

  •  1
  • user3746259  · 技术社区  · 9 年前

    我目前正在我的php项目[Ratchet,Symfony]中使用Websockets。当用户登录时,他会自动连接到websocket连接中的通道。我能够将消息推送到频道,并在客户端接收+显示消息。因此,在登录后连接到websocket时管理对它的访问是没有问题的。假设我们有以下情况,我在认证方面遇到了一个问题:

    1. 用户已登录并可以访问频道
    2. 用户注销另一个选项卡或清除其缓存
    3. 在用户重新加载页面之前,他仍然会收到网络套接字频道的消息。

    我检查了用户在使用websockets而不是ajax时,是否仍然登录到websocket端的symfony会话。当我使用ajax演示请求进行检查时,用户不再登录。这是主要的问题,websocket会话与symfony会话没有很好地同步,因为在symfoy会话中,用户已注销,但在websocket上,他仍处于登录状态。

    最初,我尝试了以下方法来避免上述情况:

    1. 当用户通过网络套接字通道收到新消息时,我首先使用远程调用过程,通过从服务器发送标志true或false来检查用户是否仍在登录(这就是不同步会话出现问题的地方)
    2. 当标志为false时,我取消用户对频道的订阅
    3. 当标志为true时,我处理websocket通道的回调。

    总的来说,我认为这种方法很好(?),但我看到的问题是会话不同步。如何同步它或强制websocket通道在推送到达它时检查cookie/再次发送它?你如何处理这种情况?

    1 回复  |  直到 9 年前
        1
  •  1
  •   mitchken    9 年前

    我个人是如何解决这个问题的。 我保存了数据库中打开时的每个连接ID。

    然后,我检查了应该为哪个通道接收哪些连接,并且只向应该接收的那些发送了一条消息。

    然后,一旦你的问题出现:一个用户注销,然后我用打开的连接从数据库中删除该用户,发送到这些频道的每条新消息将不再发送给该用户。

    编辑: 为了解决这里提出的问题:用户刷新了他/她的缓存/Cookie,但连接仍然打开,如何确保连接仍然安全?

    答:如果用户刷新其缓存,则socketconnection将保持存在,尽管用户会在刷新/重定向浏览器后关闭它。由于用户在会话开始时以正确的方式连接,然后清除其缓存,从而注销,因此这里的安全问题是不可忽视的。

    如果用户有恶意,那么首先就不应该建立连接。