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

时间:2016-10-21 13:28:35

标签: php symfony websocket ratchet

我使用此捆绑包将Ratchet websocket集成到我的Symfony2项目中:https://github.com/GeniusesOfSymfony/WebSocketBundle

我正在处理聊天应用程序。我遇到的问题是如何限制对登录用户的聊天访问?

websocket基于WAMP PubSub协议。我在ChatTopic类中的订阅方法如下所示:

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中获取用户会话并从数据库中获取所有用户数据。 我只是不知道如何防止未经授权的用户订阅聊天。

1 个答案:

答案 0 :(得分:1)

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

我建议您使用$topic->remove($conn)。如果您检查此link上的代码,您会看到它实际上从订阅者中删除了当前的$ 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(...);
}
}