Как отклонить не прошедших проверку подлинности пользователей из PHP Ratchet WebSocket?

#php #symfony #websocket #ratchet

#php #symfony #websocket #ratchet

Вопрос:

Я использую этот пакет для интеграции Ratchet websocket в мой проект Symfony2: https://github.com/GeniusesOfSymfony/WebSocketBundle

Я работаю над приложением для чата. Проблема, с которой я столкнулся, заключается в том, как мне ограничить доступ к чату для зарегистрированных пользователей?

Websocket основан на протоколе WAMP PubSub. Мой метод subscribe в классе 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. Я думаю, вы могли бы закрыть соединение для этого пользователя с помощью $connection->close() .

Ответ №1:

Использование $connection->close() ненадежно, потому что клиент может повторно подключиться и в этом случае все равно будет подписан на тему.

Я бы рекомендовал вам использовать $topic->remove($conn) . Если вы проверите код по этой ссылке, вы увидите, что он фактически удаляет текущий объект $ conn из подписчиков и, следовательно, при broadcast() вызове сообщение этому клиенту больше не приходит.

Единственная проблема заключается в том, что клиент все еще может публиковать в этом разделе (хотя он не может получать сообщения из этого раздела), но это можно предотвратить, добавив следующее условие в onPublish() метод:

 public function onPublish(RatchetConnectionInterface $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(...);
}
}