Socket.io - 向不同权限级别的用户广播的策略

时间:2016-06-28 22:55:29

标签: angularjs node.js laravel socket.io

当允许每个人查看数据时,使用socket.io将事件和数据广播到其他侦听器是很简单的。但是,当每个用户只被允许查看属于他们的数据时,我可以使用一些策略吗?

例如,我们有一个订单系统。在仪表板上,一些用户可以根据他们的访问级别查看所有订单。因此,如果订单由一个用户更新,我可以将该事件广播给所有其他用户,而无需为仪表板上打开的每个窗口检索新数据,对吗?

所以也许一个例子来自客户端socket.send('ordersUpdated', data),我认为节点服务器可以捕获它并将数据发送到监听ordersUpdated事件的其他套接字。

但是用户只能看到自己的订单呢?我无法向他们广播相同的数据,因为此级别的每个用户只能看到自己的数据。如果他们的一个订单是由可以查看所有订单的用户修改的订单怎么办?他们的仪表板也需要更新,但他们无法接收相同的广播数据。

我应该采用一种特殊方式吗?我认为,一个想法虽然不是一个好主意,但只是发送一个事件,说明更新的内容,这将导致他们从服务器重新获取数据。

为了提供更多细节,我还使用了Angular和Laravel。

1 个答案:

答案 0 :(得分:2)

一种可能性是使用聊天室来管理具有给定访问级别的用户组。例如,您可以拥有一系列按权限级别命名的房间。当用户连接到服务器并验证他们是谁时,您可以将它们放在他们所属的任何聊天室中(根据他们的权限级别)。最高级别的权限(允许查看所有订单)可能被称为“all_orders”。

然后,当订单发生变更时,您会将其广播给all_orders中的所有人以及与更改一致的任何其他聊天室。您还可以通知与订单直接关联的用户。

使用聊天室的优点是您使用内置的socket.io方案来跟踪用户组并向他们广播。您的服务器代码仍然存在责任,以确定应该向哪个用户组通知给定订单,但socket.io将管理管理一组用户并向其广播的机制。使用聊天室的另一个好处是当用户断开连接时,socket.io会自动从所有关联的聊天室中删除该套接字。如果您为组使用自己的数据结构,则必须在连接时删除给定的套接字以避免内存泄漏。