Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从PHP Ratchet WebSocket拒绝未经身份验证的用户?_Php_Symfony_Websocket_Ratchet - Fatal编程技术网

如何从PHP Ratchet WebSocket拒绝未经身份验证的用户?

如何从PHP Ratchet WebSocket拒绝未经身份验证的用户?,php,symfony,websocket,ratchet,Php,Symfony,Websocket,Ratchet,我正在使用此捆绑包将Ratchet websocket集成到我的Symfony2项目中: 我正在开发一个聊天应用程序。我遇到的问题是如何限制登录用户访问聊天室 websocket基于WAMP PubSub协议。ChatTopic类中的subscribe方法如下所示: public function onSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request) { $email = $thi

我正在使用此捆绑包将Ratchet websocket集成到我的Symfony2项目中:

我正在开发一个聊天应用程序。我遇到的问题是如何限制登录用户访问聊天室

websocket基于WAMP PubSub协议。ChatTopic类中的subscribe方法如下所示:

public function onSubscribe(ConnectionInterface $connection, Topic $topic, WampRequest $request) {
    $email = $this->clientManipulator->getClient($connection)->getUsername();
    $user = $this->userRepository->getByEmail($email);
    $msg = array();
    $msg["type"] = "userJoined";
    $msg["displayName"] = $user->getDisplayName();
    $topic->broadcast(['msg' => json_encode($msg)]);
}
如您所见,我设法在websocket中获取用户会话,并从数据库中获取所有用户数据。
我只是不知道如何防止未经授权的用户订阅聊天。

使用
$connection->close()
是不可靠的,因为客户端可能会重新连接,在这种情况下仍然会订阅该主题

我建议您使用
$topic->remove($conn)
。如果您检查此上的代码,您将看到它实际上从订阅者中删除了当前的$conn对象,因此当调用
broadcast()
时,消息不再到达该客户端

唯一的问题是客户端仍然可以发布到此主题(尽管它无法从该主题获取消息),但可以通过在
onPublish()
方法中添加以下条件来防止此问题:

public function onPublish(\Ratchet\ConnectionInterface $conn, $topic, $event, array $exclude, array $eligible) {

if (!$topic->has($conn)) {

 // user is not allowed to publish to this channel - throw exception etc.

} else {

  // user is allowed to publish

  ...
  $topic->broadcast(...);
}
}

我认为您可以使用
$connection->close()
关闭该用户的连接。