Websockets控制用户访问


Websockets control user access

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

  1. 用户已登录并有权访问某个频道
  2. 用户在另一个选项卡上注销或清除其缓存
  3. 在用户重新加载页面之前,他仍然会收到websocket通道的消息

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

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

  1. 当用户通过websocket通道获得新消息时,我首先使用远程调用过程,通过从服务器发送一个标记true或false来检查用户是否仍在登录(这就是未同步会话的问题发生的地方)
  2. 当标志为false时,我取消订阅该频道的用户
  3. 当标志为true时,我处理websocket通道的回调

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

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

然后我检查了哪些连接应该为哪个频道接收,只向应该接收的人发送了一条消息

之后,一旦出现问题:一个用户注销,然后我通过打开的连接将该用户从数据库中删除,并且这些通道的每个新消息都不会再发送给该用户。

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

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

如果用户的意图不好,那么从一开始就不应该建立连接。