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

Bibliothèques et frameworks PHP Discussion :

PB variable de session [CakePHP]


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Billets dans le blog
    2
    Par défaut PB variable de session
    Bonjour

    je rencontre un problème avec les variables de sessions de mon application. Lorsqu'un utilisateur arrive sur le site, je vérifie si il est logué, si ce n'est pas le cas je l'envoie au serveur CAS puis une fois authentifié j'enregistre des infos dans des variables de session. Je bascule ensuite sur ma première méthode, la mes variables sont bien disponibles. Je récupère quelques infos puis j'affiche le template correspondant. Là, l'utilisateur doit choisir une information. le retour à la méthode suivante fonctionne mais toutes les variables de sessions sont détruites... je ne comprends pas ce qui se passe, voici mon code:

    mon controller:
    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    class GepadbalsController extends AppController 
        {
        var $name = 'Gepadbals';
        //appel des composants
     
        public $components = array('gestionBal','zimbraAdmin','xmlParse','RequestHandler');
     
     
        /**
         * Fonction de connexion
         * @return type
         */
        public function login() 
            {
     
            $cas = new phpCAS();
            if($this->request->is('get'))
                {
                $etablissement = $this->request->pass;
                $casHost = null; $domain = null;
                if(isset($etablissement[0]))
                    {
                    switch ($etablissement[0])
                        {
                        case 1:
                            $casHost = "cas-ujf.grenet.fr";
                            $domain = "ujf-grenoble.fr";
                            break;
                        case 2:
                            $casHost = "cas-upmf.grenet.fr";
                            $domain = "upmf-grenoble.fr";
                            break;
                        case 3:
                            $casHost = "cas-ugr3.grenet.fr";
                            $domain = "u-grenoble3.fr";
                            break;
                        }
                    //redirection vers le serveur CAS pour authentification
                    $cas->client(CAS_VERSION_2_0,$casHost,443,'');
                    $cas->setNoCasServerValidation();
                    $cas->forceAuthentication();
     
                    //enregistrement des informations de session
                    $this->Session->write('username', $cas->getUser());
                    $this->Session->write('domain', $domain);
     
                    //Redirection vers index
                    if($cas->checkAuthentication()){$this->index();}
                    }
                }
            }
     
        /**
         * index method
         * Page d'entrée
         * @return void
         */
        public function index() 
            {
            $this->autoRender = false;
     
            if($this->Session->read('username'))
                {
                //Définition des variables locales
                $CN = null; $tabMail = null;
     
                //Récupération des informations du compte logué
                $account = $this->gestionBal->verifExistAccount($this->Session->read('username').'@'.$this->Session->read('domain'));
     
                //Récupération de l'identitée du compte logué
                $this->Session->write('mail', $account["ACCOUNT"]["NAME"]);
     
                foreach($account["ACCOUNT"]["A"] as $arrayid)
                    {if(isset($arrayid["N"]) && $arrayid["N"]=="cn"){$CN=$arrayid["DATA"];}}
     
                $addInst = json_decode(file_get_contents('http://zimbrapartage:sfth8:drt82@webdsi.upmf-grenoble.fr/BIPER4-WS-dev/rest/annuaire.php?q=/personnesMorales/comptes/3'));
                foreach($addInst as $list)
                    {
                    if(is_array($list))
                        {
                        foreach($list as $objectStdClass)
                            {
                            foreach($objectStdClass as $key=>$value)
                                {
                                if($key == "mail_prefere")
                                    {
                                    $listePartage = $this->gestionBal->recuperationPartage($value);
                                    if($listePartage != null)
                                        {
                                        foreach($listePartage as $mailRecevant => $droit)
                                            {
                                            if($mailRecevant == $this->Session->read('mail') && strpos($droit,"x"))
                                                {$tabMail[]=$value;}
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                //Modélisation des informations;
                $data['cn'] = $CN;
                $data['error'] = null;    
                $data['identite'] = $tabMail;
     
                //Envoie des informations au template
                $this->set($data);   
                $this->render('index');
                }
     
            else {$this->redirect("http://gepadbal.u-grenoble3.fr/gepadbals/login");}
            }
     
        /**
         * add method
         * reçoit le mail qui doit recevoir le partage
         * vérifie la validité du compte et des partages existants
         * @return void
         */
        public function add() 
            {
            $this->autoRender = false;
            var_dump($_SESSION);
            /*if($this->Session->read('username'))
                {
                //Récupération du mail à partager
                $mailAPartager = $this->request->params['pass'][0];
                //Récupération des mails qui reçoivent déjà ce partage
                $tabIdentite = $this->gestionBal->recupIdentities($mailAPartager);
                //var_dump($tabIdentite);
                $data['mail'] = $mailAPartager;
                $data['identite'] = null;
                $data['error'] = null;
                $data['cn'] = $this->request->params['pass'][1];
                if(!$this->gestionBal->getGb_error())
                    {
                    if(isset($tabIdentite[0]["zimbraPrefFromAddress"]))
                        {$data['identite'] = $tabIdentite;}   
                    }
                else {$data['error'] = $this->gestionBal->getGb_error();}
     
                $this->set($data);
                $this->render('add');
                }
            else {$this->redirect("http://gepadbal.u-grenoble3.fr/gepadbals/login");}*/
            }
    mon template:
    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
     
    <div class="gepadbals form">
        <table>
        <?php
        if($identite != null)
            {?> <tr> <th>Quelle adresse désirez vous partager? :</th> </tr><?php
            foreach($identite as $id)
                {?>
                <tr> 
                    <td><?php
                        echo $this->Html->link
                            (
                            $id,
                            '/gepadbals/add/'.$id.'/'.$cn,
                            array('class' => 'button')
                        );?>
                    </td>
                </tr>
            <?php }
            }
        else {?> <tr> <th><h2>Vous n'êtes pas autorisé à partager des adresses de service</h2></th> </tr><?php }
        if($error != null)
            { ?><tr><td><h2><?php echo $error ?></h2></td></tr><?php } ?>
        </table>
    </div>
    <?php
    //echo $this->Html->link
      //  ("test",'/gepadbals/test/',array('class' => 'button'));?>
    <h4><?php echo $cn ?></h4>
    J'ai essayé de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Configure::write('Session', array(
            'defaults' => 'php','checkAgent'=>false
        ));
    dans Config/core.php mais ça ne change rien....

    Petite précision, si je met un var_dump($_SESSION); dans mon template, je vois que mes variables de sessions sont bien présentes, c'est donc lors du "echo $this->Html->link" que ça disparait ...?

    Une petite aide ou idée serait la bienvenue

    merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Par défaut
    Hello !

    j'ai surement une manière détournée de résoudre ton problème. Tu utilises une action classique de connexion et les variables de Session pour t'authentifier, mais sache si tu ne le sais déjà, que Cake propose un composant d'authentification pour tout ce qui touche à la connexion et l'authentification des utilisateurs : le Auth Component. Il propose bien sur de base les connexions de base par HTTP et formulaire mais peut-être étendu pour s'authentifier comme on le souhaite (je fais souvent des connexions ldap, mais absolument tout et n'importe quoi est envisageable). Voici le lien vers le passage de la doc concernant les authentifications personnalisées http://book.cakephp.org/2.0/fr/core-...-personnalises. Je t'invite à le regarder, et à l'utiliser s'il te convient car il simplicite vraiment la vie

    Autrement sur le problème à proprement parlé, il faut bien que le composant Session soit chargé. Le mieux pour s'en assurer c'est de le mettre dans AppController on s'en sert tout le temps.

    Deux trois trucs au passage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Redirection vers index
    if($cas->checkAuthentication()){$this->index();}
    A éviter (ne jamais appeler directement une méthode d'un controller de manière générale), privilégier toujours une manière "clean" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->redirect(array('action' => 'index');
    (Sans être certain de rien, il est possible que ceci soit une cause de ton problème)

    Ce que tu as écris après ne peut marcher :
    La méthode set a toujours deux parmètres, clef et valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $this->set('data',$data);
    //ou, la méthode feignasse
    $this->set(compact('data'));
    En ce qui concerne ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       if($error != null)
            { ?><tr><td><h2><?php echo $error ?></h2></td></tr><?php } ?>
        </table>
    tout ce qui est message d'erreurs, de succès, messages "flashs", informatifs etc... Cake à une méthode pour cela (il passe d'ailleurs par les sessions) : $this->Session->setFlash (lien vers la doc)

    Enfin pour terminer, il existe une autre méthode, un peu plus "propre/clair" et surtout plus sur pour faire des liens (même si ce que tu fais marche très bien aussi) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    echo $this->Html->link( $id,
       array('controller' => 'gepabals', 'action' => 'add', $id, $cn),
       array('class' => 'button')
    );

  3. #3
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Billets dans le blog
    2
    Par défaut
    ok merci pour ta réponse très complète, je vais regarder tout ça demain au boulot...

    Pour l'authentification au début j'avais utilisé la méthode de base en effet mais devant ensuite basculer sur notre cas j'ai modifié le système. Je n'ai pas réussi justement à implémenter une méthode personnalisée (ce qui m'ennuie car je suis obligé de bricoler pour arriver au même résultat... ). Je vais re-tester ça et te tiens au courant.

    Merci

  4. #4
    Rédacteur
    Avatar de Viduc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    1 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Février 2009
    Messages : 1 445
    Billets dans le blog
    2
    Par défaut
    Bon, j'ai avancé mais je suis loin d'avoir réglé le problème.

    Du coup je bloque sur le système d'authentification, j'ouvre un nouveau sujet sur ce problème.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Tester existence d'une variable de session
    Par IDNoires dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/12/2004, 12h30
  2. Création d'une variable de session avec un ID
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 18/10/2004, 10h28
  3. Effacer les variables de session
    Par glsn dans le forum ASP
    Réponses: 2
    Dernier message: 12/12/2003, 13h42
  4. Variable de session
    Par Sadneth dans le forum ASP
    Réponses: 6
    Dernier message: 14/11/2003, 11h12
  5. variable de session
    Par divableue dans le forum ASP
    Réponses: 2
    Dernier message: 23/10/2003, 16h04

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