Websockets 控制用户访问
Websockets control user access
我目前在我的 php 项目 [Ratchet, Symfony] 中使用 Websockets。当用户登录时,他会自动连接到 websocket 连接中的通道。我能够将消息推送到频道并在客户端接收+显示它们。因此,在登录后连接到 websocket 时管理对 websocket 的访问是没有问题的。假设我们有以下情况,我在身份验证方面遇到问题:
- 用户已登录并可以访问频道
- 用户在另一个选项卡上注销或清除其缓存
- 直到用户重新加载他的页面,他仍然会收到 websocket 通道的消息。
我检查过用户在使用 websockets 而不是 ajax 时仍然在 websocket 端 symfony 会话中登录。当我使用 ajax demo -请求检查相同内容时,用户不再登录。这是主要问题,websocket 会话与 symfony 会话没有很好地同步,因为在 symfony 会话中,用户已注销但在 Websocket 上,他仍然登录。
最初,我尝试了以下方法来避免上述情况:
- 当用户通过 websocket 通道收到一条新消息时,我首先通过使用远程调用程序检查用户是否仍然登录,方法是从服务器发送一个 true 或 false 标志(这就是不同步的问题所在会话发生)
- 当 flag 为 false 时,我退订该用户的频道
- 当flag为true时,我处理websocket通道的回调。
总的来说,我认为这种方法可以(?),但我看到的问题是未同步的会话。如何同步它或强制 websocket 通道检查 cookie/在推送到达时再次发送它?你如何处理这种情况?
我个人是如何解决这个问题的。
我在数据库中打开时保存了每个 connectionId。
然后我检查了哪些连接应该接收哪些通道,并且只向那些应该接收它的人发送消息。
之后,一旦您的问题出现:用户注销,然后我将用户从打开连接的数据库中删除,并且不会再向这些频道发送每条新消息。
编辑:
解决这里提出的问题:用户刷新his/hercache/cookies,但是连接还是打开的,如何保证连接还是安全的?
回答:如果用户刷新 his/her 缓存,套接字连接将保持存在,但一旦浏览器 refreshed/redirected 用户将关闭它。这里的安全问题是不存在的,因为用户在会话开始时以正确的方式连接,然后清除了他们的缓存,所以他们被注销了。
如果用户有恶意,那么一开始就不应该建立连接。
我目前在我的 php 项目 [Ratchet, Symfony] 中使用 Websockets。当用户登录时,他会自动连接到 websocket 连接中的通道。我能够将消息推送到频道并在客户端接收+显示它们。因此,在登录后连接到 websocket 时管理对 websocket 的访问是没有问题的。假设我们有以下情况,我在身份验证方面遇到问题:
- 用户已登录并可以访问频道
- 用户在另一个选项卡上注销或清除其缓存
- 直到用户重新加载他的页面,他仍然会收到 websocket 通道的消息。
我检查过用户在使用 websockets 而不是 ajax 时仍然在 websocket 端 symfony 会话中登录。当我使用 ajax demo -请求检查相同内容时,用户不再登录。这是主要问题,websocket 会话与 symfony 会话没有很好地同步,因为在 symfony 会话中,用户已注销但在 Websocket 上,他仍然登录。
最初,我尝试了以下方法来避免上述情况:
- 当用户通过 websocket 通道收到一条新消息时,我首先通过使用远程调用程序检查用户是否仍然登录,方法是从服务器发送一个 true 或 false 标志(这就是不同步的问题所在会话发生)
- 当 flag 为 false 时,我退订该用户的频道
- 当flag为true时,我处理websocket通道的回调。
总的来说,我认为这种方法可以(?),但我看到的问题是未同步的会话。如何同步它或强制 websocket 通道检查 cookie/在推送到达时再次发送它?你如何处理这种情况?
我个人是如何解决这个问题的。 我在数据库中打开时保存了每个 connectionId。
然后我检查了哪些连接应该接收哪些通道,并且只向那些应该接收它的人发送消息。
之后,一旦您的问题出现:用户注销,然后我将用户从打开连接的数据库中删除,并且不会再向这些频道发送每条新消息。
编辑: 解决这里提出的问题:用户刷新his/hercache/cookies,但是连接还是打开的,如何保证连接还是安全的?
回答:如果用户刷新 his/her 缓存,套接字连接将保持存在,但一旦浏览器 refreshed/redirected 用户将关闭它。这里的安全问题是不存在的,因为用户在会话开始时以正确的方式连接,然后清除了他们的缓存,所以他们被注销了。
如果用户有恶意,那么一开始就不应该建立连接。