如何区分socket.io聊天中的Symfony用户角色/组

Geo*_*iuc 18 php sockets node.js symfony socket.io

我一直在玩socket.io的聊天,我有一个问题:如何在聊天室中区分管理员用户和普通用户?我希望管理员拥有像踢和禁止人的权力,但我的用户却没有.

我正在使用Symfony开发我的应用程序,我想将其用户数据库用于聊天用户.我正在为我的Symfony应用程序的用户使用FOSUserBundle.它们被分成多个组,所以我有这个admin组,还有其他组.

admin组具有ROLE_ADMIN这意味着其中的每个用户都具有该角色.这是管理员组,该组中的每个用户都应具有禁止,踢,静音等聊天室中其他用户的权限.

为了在聊天中使用我的Symfony用户,我一直在阅读Redis以获取他们的会话,但我不确定如何区分我的管理员用户和普通用户.如何阻止常规用户向服务器发出请求,该服务器执行用户无权访问的内容?因为任何人都可以提出请求,但是如果这些请求来自存储在Apache服务器上的MySQL数据库中的用户,我该如何验证这些请求呢?

如果不是Symfony,如何在常规PHP应用程序中完成此操作?最后,如何定义管理员并不重要,但如何将他连接到节点服务器以及如何使节点服务器与我的用户数据库一起工作.

我只想加密并将用户的数据发送到节点服务器,然后在那里解密.只有两个服务器知道私钥,因此即使客户端接收到加密数据,他也无法向其他客户端发出请求.我可以做一些IP检查和时间戳.然后可以使用节点服务器上的解密数据来说明用户是否是管理员并允许他发送某些请求.这是一个好主意还是有更好的方法?

Bog*_*dan 3

我的想法是简单地加密并将用户的数据发送到节点服务器,然后在那里解密。只有两台服务器知道私钥,因此即使客户端获得了加密数据,他也无法向另一个客户端发出请求。

这就是基本的想法。

我会怎样做呢?我会使用 JWT 之类的东西将 userId 发送到节点应用程序。不必加密,因为我只关心 jwt 签名以确保请求确实是由真实用户发出的。

之后,我将使用 userId对 php 应用程序进行服务器端调用来检查用户的角色。

详细说明:

  • 节点应用程序和 php 应用程序将使用共享密钥来签署 JWT 令牌。
  • PHP 应用程序会将生成的令牌公开给前端。
  • socket.io 客户端会将令牌作为身份验证的一部分发送给节点应用程序。

如何处理封禁

  • 保留打开的套接字及其用户 ID 的列表
  • 在 Nodejs 应用程序中创建一个 Web 服务端点,它可以处理来自 php 应用程序的“禁止”请求。
  • 当nodejs应用程序收到这样的请求时,根据用户ID查找套接字并关闭连接。