2016-10-21 6 views
0

私はこのバンドルを使用して、Ratchet websocketをSymfony2プロジェクトに統合しています:https://github.com/GeniusesOfSymfony/WebSocketBundlePHPから非認証ユーザを拒否する方法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内のユーザーセッションを取得し、DBからすべてのユーザーデータをフェッチするために管理。 私は、権限のないユーザーがチャットに登録するのを防ぐ方法を知りません。

+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(...); 
} 
} 
関連する問題