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

问题描述:

我正在使用此捆绑将棘轮websocket整合到我的Symfony2项目中:https://github.com/GeniusesOfSymfony/WebSocketBundle如何从PHP Ratchet WebSocket中拒绝未经过身份验证的用户?

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

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

+0

我想你可以使用'$ connection-> close()'关闭该用户的连接。 – qooplmao

使用$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(...); 
} 
}