IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

problème avec redis session handler


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Par défaut problème avec redis session handler
    J'ai stocké les sessions utilisateur en redis (en utilisant SncRedisBundle) pour les rendre utilisables pour Symfony2 et Node js.
    Mon problème c’est quand j’essaye d'obtenir le « token » et le nom d'utilisateur « username » à partir de redis avec node js le console m'affiche « unexpected token » et lorsque je fait un get dans redis-cli j’obtiens:

    127.0.0.1:6379> get "session_:nuinnf7hi2c6i0ijdjn6c49mi2"
    "_sf2_attributes|a:3{s:18:\"_csrf/authenticate\";s:43:\"scK0QT97IKUIWDTWBVYiuAzKgUFy7JBOgsGANgPAU\";s:14:\"_security_main\";s:584:\"C:74:\"Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken\":496{a:3{i:0;N;i:1;s:4:\"main\";i:2;s:456:\"a:4{i:0;C:29:\"Acme\\UserBundle\Document\\User\":247{a:9{i:0;s:88:\"aish60kYjl4oJ4KLGA0LER7ob3yNw30ui4RT70HLJ8hzub24xaI8tcHb7g8QjezH8EMBbBBCQKZL9juyqc4c1w==\";i:1;s:31:\"d69hb3xz0o0g0kskg0wcwgc0kk8occw\";i:2;s:5:\"admin\";i:3;s:5:\"admin\";i:4;b:0;i:5;b:0;i:6;N;i:7;b:1;i:8;s:24:\"54e9e6e8898988b00e000029\";}}i:1;b:1;i:2;a:1{i:0;O:41:\"Symfony\\Component\\Security\\Core\\Role\\Role\":1{s:47:\"\x00Symfony\\Component\\Security\\Core\\Role\\Role\x00role\";s:9:\"ROLE_USER\";}}i:3;a:0:{}}\";}}\";}_sf2_flashes|a:0:{}_sf2_meta|a:3:{s:1:\"u\";i:1426000749;s:1:\"c\";i:1426000646;s:1:\"l\";s:1:\"0\";}"

    mais je veux juste récupérer "token" et "username" de la session.
    Qui peut m'aider
    Rq: j'utilise FosUserBundle pour la gestion des utilisateurs et mon objectif et de faire une conversation entre 2 personnes en utilisant node js , socket io et redis.

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    Bonjour,

    les données de sessions sont effectivement encodés dans un format particulier proche de la méthode serialize, donc difficile à partager entre divers applicatif
    http://php.net/manual/fr/function.session-encode.php

    Il faudrait que tes données soit encodés en json pour être plus portable.
    Il devrait être possible de créer ton propre Session Handler pour convertir les données en json en t'inspirant de l'existant
    https://github.com/snc/SncRedisBundl...ionHandler.php

    quelque chose comme cela peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
     
    class CustomRedisSessionHandler extends   Snc\RedisBundle\Session\Storage\Handler\RedisSessionHandler
    {
     
        public function write($id,$dataAsSessionEncodedString)
        {
              $dataAsPhpArray=session_decode($dataAsSessionEncodedString);
              $dataAsJson=json_encode($dataAsPhpArray);
              parent::write($id,$dateAsJson);
        }
     
        public function read($id)
        {
            $dataAsJson=parent::read($id);
            $dataAsPhpArray=json_decode($dataAsJson);
            $datasAsSessionEncodedString=session_encode($dataAsPhpArray);
            return $datasAsSessionEncodedString;
        }
    }
    Il suffirait juste de redéfinir le parametre snc_redis.session.handler.class pour y mettre ton Custom handler
    https://github.com/snc/SncRedisBundl...ig/session.xml


    NB :
    Il y a peut être plus simple et optimisé en redéfinissant la méthode de serialisation des sessions, voir ici:
    http://php.net/manual/en/session.con...ialize-handler

  3. #3
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 2
    Par défaut
    Bonjour,
    Vous avez bien compris mon problème et merci pour votre réponse
    mais j'ai déjà trouvé et testé la solution ci-dessous pour convertir les données en json mais mon problème reste le même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    <?php
     
    namespace Snc\RedisBundle\Session\Storage\Handler;
     
    /**
     * Sessionhandler to serialize PHP sessions into redis using json as
     * format.
     *
     * This way we can read the session in node.js websockets.
     *
     * @author "Robert Gruendler <r.gruendler@gmail.com>"
     */
    class JsonSessionHandler extends RedisSessionHandler
    {
     
        /*
         *  {@inheritdoc}
         */
        public function write($sessionId, $data)
        {
            $raw = $this->unserializeSession($data);
            $session = json_encode($raw);
            parent::write($sessionId, $session);
        }
     
        /*
         *  {@inheritdoc}
         */
        public function read($sessionId)
        {
            $raw = parent::read($sessionId);
     
            if (strlen($raw) == 0) {
                return $raw;
            }
     
            return $this->serializeSession(json_decode($raw, true));
        }
     
        /**
         * @see http://php.net/manual/en/function.session-decode.php#108037
         * @param array $session_data
         * @throws Exception
         * @return multitype:mixed
         */
        private function unserializeSession($session_data)
        {
            $return_data = array();
            $offset = 0;
            while ($offset < strlen($session_data)) {
                if (!strstr(substr($session_data, $offset), "|")) {
                    throw new Exception("invalid data, remaining: " . substr($session_data, $offset));
                }
                $pos = strpos($session_data, "|", $offset);
                $num = $pos - $offset;
                $varname = substr($session_data, $offset, $num);
                $offset += $num + 1;
                $data = unserialize(substr($session_data, $offset));
                $return_data[$varname] = $data;
                $offset += strlen(serialize($data));
            }
            return $return_data;
        }
     
        /**
         * @see http://php.net/manual/en/function.session-encode.php#76425
         * @param array $array
         * @return string
         */
        private function serializeSession(array $array)
        {
            $raw = '';
            $line = 0;
            $keys = array_keys($array);
            foreach ($keys as $key) {
                $value = $array[$key];
                $line++;
     
                $raw .= $key . '|';
     
                if (is_array($value) && isset($value['huge_recursion_blocker_we_hope'])) {
                    $raw .= 'R:' . $value['huge_recursion_blocker_we_hope'] . ';';
                } else {
                    $raw .= serialize($value);
                }
                $array[$key] = Array('huge_recursion_blocker_we_hope' => $line);
            }
            return $raw;
        }
     
    }
    Ma question c'est : si j'utilise "jms/serializer-bundle" et je désactive la serializer pour FOSUserBundle entities j’obtiendrais une résultat ou non ???
    Si non j'espère que vous me donner votre propositions je suis totalement bloqué !!!!!!!!!!!!!!!!!!!!!

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Par défaut
    mon problème reste le même
    c'est à dire ?
    Les valeurs dans Redis restent sérialisés "à la php"?
    Est tu sur que ton Handler est utilisé?

    si je désactive la serializer pour FOSUserBundle entities j’obtiendrais une résultat ou non ???
    Sauf erreur de ma part ou customisation particulière de ton appli, ce n'est pas le sérializer de symfony ou de JMS qui est utilisé mais les fonctions session_encode/session_decode évoqué précedemment.



    Mais aprés réflexion, transformer directement les données sérialisés par php en json ne parait pas une bonne solution.
    Au moment de la désérialisation (méthode "read($sessionId)"), il est nécessaire d'avoir des infos sur la façon de désérialiser notamment quel classe php utiliser.
    D'ou l'utilité des "\"Symfony\\Component\\Security\\Core\\Authentication\\Token\\UsernamePasswordToken\"" etc... dans les données de session accessbles dans Redis.

    Tu pourrais creuser une piste comme ceci: le json contient les données encodés + d'autres valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public function write($id,$dataAsSessionEncodedString)
        {
              $dataAsPhpArray=array('php_data_session'=>dataAsSessionEncodedString));
              $dataAsPhpArray['username']=???;
              //il faudrait récupérer le username :
              // - soit en décodant $dataAsSessionEncodedString
              // - soit via un listener qui alimenterait un attribut username sur cette classe
              // - soit en injectant le container pour utiliser le service security.context
     
              $dataAsJson=json_encode($dataAsPhpArray);
              parent::write($id,$dataAsJson);
        }
    public function read($id)
        {
            $dataAsJson=parent::read($id);
            $dataAsPhpArray=json_decode($dataAsJson);
            return $dataAsPhpArray['php_data_session'];
        }

    Une solution + radicale serait d'utiliser php et Ratchet au lieu de javascript et Node.js.
    Ce Bundle semble interessant mais son développement parait malheureusement au point mort.
    https://github.com/JDare/ClankBundle

Discussions similaires

  1. [Cookies] Problème avec les sessions PHP !!!
    Par boukay dans le forum Langage
    Réponses: 4
    Dernier message: 14/02/2006, 17h32
  2. Problème avec les sessions!!!
    Par frutix dans le forum Langage
    Réponses: 2
    Dernier message: 20/01/2006, 11h35
  3. problème avec les sessions
    Par DiverSIG dans le forum Langage
    Réponses: 2
    Dernier message: 28/11/2005, 11h01
  4. Problèmes avec les Sessions
    Par alexthomas dans le forum Langage
    Réponses: 5
    Dernier message: 20/11/2005, 21h53
  5. Problème avec les sessions
    Par philippef dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2005, 15h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo