Partage

Symfony - WebSocket Ratchet | Get utilisateur

13 janvier 2019 à 1:56:20

Bonsoir, je travaille sur un projet Symfony et j'ai développé un chat avec Ratchet, tout fonctionne comme il faut, mais impossible de récupérer l'utilisateur actuel. j'arrive à récupérer l'utilisateur du chat / qui utilise les websockets, mais je n'arrive pas à récupérer celui de la session. J'utilise le composant security pour gérer les utilisateurs et les sessions, si des âmes charitables savent comment faire, je suis preneur !

Merci d'avance :)

-
Edité par Alexandre_Barde 13 janvier 2019 à 2:04:08

13 janvier 2019 à 8:04:53

Bonjour,

Je ne sais pas dans quelle version de Symfony tu es ...

Moi j'utilise le bundle GosWebSocketBundle https://github.com/GeniusesOfSymfony/WebSocketBundle

qui utilise Ratchet et pour récupérer dans l'action de mon contrôleur qui lance le chat je fais par exemple :

$container->get('security.token_storage')->getToken()->getUser();


A+

13 janvier 2019 à 13:38:44

Bonjour, j'utilise la version 4.1 de Symfony.

J'avais essayé d'utiliser Gos pour gérer les WebSockets mais impossible de le faire fonctionner, je me suis donc rabattu sur Ratchet, mais il est donc possible de combiner les deux ?

Edit :

Dans ma classe ChatServerCommand (là où le serveur se lance), je passe en paramètre le container dans mon constructeur Chat :

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $server = IoServer::factory(
            new HttpServer(new WsServer(new Chat($this->getContainer()))),
            8080,
            '127.0.0.1'
        );
        $server->run();
    }

 Classe Chat :

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container->get('security.token_storage');
        $this->clients = new \SplObjectStorage();
    }

    public function onOpen(ConnectionInterface $conn)
    {
        echo "user : " . $this->container->getToken->getUser();
        $this->users[$conn->resourceId] = ['connection' => $conn, 'user' => '', 'channels' => []];
    }

Mais le serveur se coupe sans avoir d'erreur :(



-
Edité par Alexandre_Barde 13 janvier 2019 à 14:21:04

14 janvier 2019 à 8:34:38

Sauf erreur GosWebSocketBundle fonctionne sous Symfony 4 mais je suis en Symfony 3.4.21 donc je ne peux l'assurer.

Je ne comprends pas ta remarque de "combiner les deux" : quand tu installes GOS tu installes en même temps par dépendances Ratchet - tu n'as pas besoin de combiner ... cela se fait tout seul.

Ce que tu dis dans ton second poste "le serveur se coupe" n'est plus le même problème que le premier (get utilisateur) me semble t-il ?

Je suis étonné de ta ligne 3 dans le onOpen avec le getToken sans () : ce ne devrait pas plutôt être getToken() ?

A+

14 janvier 2019 à 9:55:01

Bonjour, je viens de modifier le getToken en getToken(), lors de la connexion d'un client, le serveur plante :

Call to a member function getUser() on null 

Et oui en effet, au temps pour moi, je n'avais pas vu que Gos était inclut et utilisé avec Ratchet.

14 janvier 2019 à 13:36:28

Cela plante mais es tu sûr d'avoir bien récupéré le container ?

Ne serait-il pas mieux d'injecter juste le user ?

Par ailleurs si tu obtiens le user par le getUser(), ce sera certainement un objet je pense ? donc un echo ne va pas le faire.

A+

14 janvier 2019 à 15:15:23

Hum, comment je pourrais m'assurer qu'il récupère bien le container ?

Comment ça ? Dans la classe ChatServerCommand ajouter le xx->getToken()->getUser() ?

14 janvier 2019 à 17:46:34

Je ne connais pas ton code à part les quelques bribes ci-dessus.

Il y a un truc que je ne pige pas bien ...

Tu lances ton serveur de websocket dans la commande : ça ok !

Ensuite il va y avoir différents utilisateurs qui vont se connecter ... mais pas au moment du lancement du serveur.

Pour se connecter un utilisateur doit certainement être déjà identifié dans ton site. Puis il va lancer la page de connexion au chat - à ce moment que ce soit dans le twig ou dans l'action du contrôleur c'est assez simple de retrouver l'utilisateur.

Tout cela est fait avec GOS ...

A+

14 janvier 2019 à 20:36:47

Oui mais justement je voudrais récupérer l'utilisateur qui est connecté afin de stocker dans ma base de données les messages et faire d'autres actions. Et actuellement c'est comme ça que ça fonctionne, le problème étant que l'utilisateur peut modifier le code html / javascript pour changer son pseudo et là c'est problématique :(
Il y a environ 22 heures

Je ne vois plus trop le rapport avec ta question d'origine.

Dans mon cas, si un utilisateur savait modifier côté navigateur son pseudo (utilisation des outils de debug par exemple), cela ne servirait à rien puisque ce n'est pas le client (navigateur) qui identifie mais le serveur côté session.

A+

Il y a environ 17 heures

Si justement tout est lié, je veux récupérer l'utilisateur côté serveur (session) pour ensuite envoyer la websocket qui contient le pseudo + le message et non comme ce qui a actuellement, c'est à dire le pseudo et le message qui sont envoyés en JS puis transféré via les websockets. Et oui je veux faire comme tu as fait, pour pas que l'utilisateur puisse changer son pseudo.
Il y a environ 1 heure

Désolé, je ne comprends pas ton problème. 

Je t'ai donné une des manières pour récupérer l'utilisateur dans ton action mais tu peux aussi le récupérer côté twig.

Alors je vais en rester là.

Si tu utilises GOS et que tu as un problème je pourrai peut-être t'aider.

Bye

Symfony - WebSocket Ratchet | Get utilisateur

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
  • Editeur
  • Markdown