2016-10-21 72 views
0

我正在使用此捆綁將棘輪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

回答

0

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