socket.io 房间授权

socket.io room authorisation

我有一个 socket.io 的用例,其中在一个单独的命名空间内,一个客户端可以连接到多个房间。用户需要在每个房间的基础上进行身份验证(因为可能不允许他们访问这些数据流)。

显然,我可以使用中间件函数和一些身份验证数据来检查连接到命名空间的授权,但是除非这些房间在连接启动时已经在 socket.rooms 中,否则我不知道如何检查, 当一个 socket 加入一个房间时,无论它是否被授权,如果它没有被授权,随后强制它离开房间。

是否有 join 事件或等效方法?就像命名空间的 connection 事件,但房间。

编辑

通读 socket.io 的源代码后,似乎套接字加入房间时不会触发任何事件,但我可能误解了一些东西:在阅读 socket.io-client 的源代码时,加入rooms 不是系统固有的,这表明这只能在服务器端触发。在那种情况下,我假设我必须自己管理客户加入房间?如果这是真的,那么我就可以拥有类似的东西:

socket.on('join', function(data) { ... });

这样当一个套接字想要监听一个特定的数据流时,它只是 emit 一个 "join" 事件,带有一些关于它想加入哪个房间的数据,我处理整个服务器上的东西?

只能在服务器上加入房间。客户端通常会向服务器发送特定于应用程序的消息,向您的应用程序指示他们想要加入特定房间,然后如果请求有效,服务器会代表用户执行该操作。

因此,您所要做的就是将所有代码路由到服务器上,这些代码可以通过一个特定的功能加入房间,该功能可以执行您想要执行的任何身份验证。例如,您可以简单地创建一个函数,这是您的服务器代码将插座放入房间的唯一方式:

function joinAuth(socket, room) {
    // can do anything you want here before actually joining the room
}