#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(...);
}
}