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

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

我正在使用Symfony来开发我的应用程序,我想用聊天用户的用户数据库。 我为我的Symfony应用程序的用户使用FOSUserBundle 。 他们分成多个组,所以我有admin组和其他人。

admin组具有ROLE_ADMIN ,这意味着其中的每个用户都具有该angular色。 这是pipe理员组,并且该组中的每个用户都应该有权禁止,踢,静音等聊天室中的其他用户。

为了在聊天中使用我的Symfony用户,我一直在阅读Redis以获得他们的会话,但是我不确定如何区分我的pipe理员用户和普通用户。 我怎样才能防止普通用户向服务器发出一个用户无法访问的请求? 因为任何人都可以提出请求,但是如果他们来自存储在Apache服务器上的MySQL数据库中的用户, 我怎么能validation这些请求呢?

如果不是Symfony,那么这可以在一个普通的PHP应用程序中完成? 最后,pipe理员如何定义并不重要,而是如何将他连接到节点服务器以及如何使节点服务器与我的用户数据库一起工作。

我有一个简单的encryption和发送用户的数据到节点服务器,然后在那里解密的想法。 只有两台服务器知道私钥,所以即使客户端掌握了encryption的数据,也不能向另一个客户端发出请求。 我可能会做一些IP检查和时间戳。 然后可以使用节点服务器上的解密数据来说明用户是否是pipe理员,并允许他发送某些请求。 这是一个好主意还是有更好的办法?

我有一个简单的encryption和发送用户的数据到节点服务器,然后在那里解密的想法。 只有两台服务器知道私钥,所以即使客户端掌握了encryption的数据,也不能向另一个客户端发出请求。

这是基本的想法。

我该怎么做呢? 我将使用类似JWT的东西来发送userId到节点应用程序。 不需要encryption,因为我只关心jwt签名,以确保请求确实由真实用户发出。

之后,使用userId我会做一个服务器端调用的PHP应用程序来检查用户的angular色。

详细说明:

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

如何处理禁止

  • 保留与他们的用户ID打开套接字的列表
  • 在nodejs应用程序中创build一个web服务端点,它可以处理来自php应用程序的“禁止”请求。
  • 当nodejs应用程序接收到这样的请求时,根据用户标识查找套接字并closures连接。

我通常会创build一个SecurityAccessManager服务来检查用户的angular色与选民的电话(我可以提供一个exemple如果需要)来检查特定的权利,如“这个用户可以更新这个特定的职位?

configuration

 company.navigation.security_access: class: Company\NavigationBundle\Services\SecurityAccessManager arguments: - @security.authorization_checker - @security.token_storage 

服务代码

 namespace Company\NavigationBundle\Services; use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage; use Symfony\Component\Security\Core\Exception\AccessDeniedException; class SecurityAccessManager { private $authorizationChecker; private $tokenStorage; private $debug; public function __construct( AuthorizationCheckerInterface $authorizationChecker, TokenStorage $tokenStorage) { $this->authorizationChecker = $authorizationChecker; $this->tokenStorage = $tokenStorage; $this->debug = true; } // ************************************************************************* // User // ************************************************************************* public function getUser() { return $this->tokenStorage->getToken()->getUser(); } public function getUserId() { return $this->tokenStorage->getToken()->getUser()->getId(); } public function isAuthenticatedUser() { return $this->authorizationChecker->isGranted('IS_AUTHENTICATED_REMEMBERED'); } // ************************************************************************* // Roles checker // ************************************************************************* public function isAdmin() { if($this->authorizationChecker->isGranted('ROLE_ADMIN') !== true) { return false; } else { return true; } } public function checkRightAdmin() { if($this->authorizationChecker->isGranted('ROLE_ADMIN') !== true) { throw new AccessDeniedException('Unauthorised access! '.($this->debug ? __FUNCTION__ : null)); } return true; } public function checkUserHasRightToEditPost($postId) { // Check if user has right to modify the post if ($this->authorizationChecker->isGranted('is_user_has_right_to_edit_post', $postId) === false) { throw new AccessDeniedException('Unauthorised access! '.($this->debug ? __FUNCTION__ : null)); } return true; } } 

然后,在您的控制器操作中,您可以检查用户的权限

 namespace Company\YourBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class YourBunbleController extends Controller { /** * Get the service * @return \Company\NavigationBundle\Services\SecurityAccessManager */ private function getService() { return $this->get('company.navigation.security_access'); } public function updatePostAction(Request $request, $postId) { // Throw 403 if user has no admin rights $this->getService()->checkRightAdmin(); // Throw 403 if user has no rights to update the post $this->getService()->checkUserHasRightToEditPost(); //OK, you can update database ... } }