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

使用socket.io将事件和数据广播给其他监听器是很简单的,每个人都可以看到数据。 但是,当每个用户只能看到属于他们的数据时,有没有一些策略可以使用?

例如,我们有一个订单系统。 在仪表板上,一些用户可以根据访问级别查看所有订单。 所以如果一个订单被一个用户更新,我可以把这个事件广播给所有其他的用户,而不必为仪表盘上的每个窗口检索新的数据。

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

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

有什么特别的方法可以解决这个问题吗? 一个想法,虽然我认为不是一个好主意,但只是发送一个事件,说一些更新的事情,这将导致他们从服务器重新获取数据。

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

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

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

使用聊天室的好处是您可以使用内置的socket.ioscheme来跟踪用户组并进行广播。 这个责任仍然在你的服务器代码上,以确定哪一组用户应该被通知一个给定的命令,但是socket.io将pipe理一组用户的pipe理和广播给他们。 使用聊天室的另一个好处是当用户断开连接时,socket.io会自动从所有相关的聊天室中删除该套接字。 如果您使用您自己的数据结构的组,您将不得不删除一个给定的套接字随时连接,以避免内存泄漏。