Websockets控制用户访问

时间:2016-05-08 19:08:58

标签: php symfony authentication websocket ratchet

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

  1. 用户已登录并可以访问频道
  2. 用户在另一个标签页上注销或清除其缓存
  3. 直到用户重新加载他的页面,他仍然得到websocket频道的消息。
  4. 我检查过用户在使用websockets而不是ajax时仍然登录websocket方面的symfony会话。当我使用ajax demo -request检查相同时,用户不再登录。这是主要问题,websocket会话与symfony会话不能很好地同步,因为在symfony会话中,用户已注销,但在Websocket上,他仍然登录。

    最初,我尝试了以下操作以避免上述情况:

    1. 当用户通过websocket频道获取新消息时,如果用户仍然通过从服务器发送标志为true或false来登录,我首先使用远程调用过程进行检查(那里发生了非同步会话的问题) )
    2. 当该标志为false时,我取消订阅该频道的用户
    3. 当标志为真时,我处理websocket频道的回调。
    4. 一般来说,我认为这种方法很好(?),但我看到的问题是非同步会话。如何同步它或强制websocket通道检查cookie /推送到达时再次发送?你是如何处理这种情况的?

1 个答案:

答案 0 :(得分:1)

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

然后我检查了哪些连接应该接收哪个通道,并且仅向应该接收它的人发送消息。

之后一旦出现问题:用户退出,然后我通过打开的连接从数据库中删除用户,并且不再向这些用户发送每条新消息。

编辑: 要解决此处提出的问题:用户刷新他/她的缓存/ cookie,但连接仍然打开,如何确保连接仍然安全?

答案:如果用户刷新他/她的缓存,则套接字连接会保持不变,尽管用户会在刷新/重定向后关闭它。这里的安全问题是不存在的,因为用户在会话开始时以正确的方式连接,然后清除了它们的缓存,以便它们被注销。

如果用户有不良意图,那么首先应该从未建立连接。