Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-03-2012 10:43:42

0866
Membre
Date d'inscription: 02-04-2010
Messages: 27

[Résolu][Zend_Session][8.0.0]expiration page

Bonjour tout le monde,
ma question est : comment peut en expirer une page qui reste inactif pour certain temps et lorsque elle sera  expirer une redirection automatique vers une autre page .

j'ai essayer

Code:

 Zend_Session::rememberMe(300);
 Zend_Session:: destroy();

 if (Zend_Session:: isDestroyed() ){
    $this->_redirect('index/login');
        
  }

mais le navigateur n'attend pas 300 seconds il fait le redirection automatique.

alors il y a t'il quelqu'un qui peut m'aider !!!!!!!!!!!!

merci d'avance.

Dernière modification par 0866 (07-03-2012 12:21:10)

Hors ligne

 

#2 05-03-2012 11:05:44

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu][Zend_Session][8.0.0]expiration page

Salut, si je prend ton code à la lettre je dirais que c'est normal puisque tu détruis la session juste après lui avoir donné un timeout.

Si c'est dans le but de nous montrer les différentes fonctions que tu as utilisé, je te conseil d'utiliser Zend_Session::regenerateId() et penser à faire un Zend_Session::start(). Si je me souviens bien dans la doc il est indiqué que c'est nécessaire.

Hors ligne

 

#3 05-03-2012 11:18:53

0866
Membre
Date d'inscription: 02-04-2010
Messages: 27

Re: [Résolu][Zend_Session][8.0.0]expiration page

Merci ,
mais j met le zend_session::start dans mon code ,
voici le code de mon controller Index :

Code:

 
public function init()
    {
        /* Initialize action controller here */
   
        $this->db = Zend_Db::factory('Oracle', array(
            'username'    => '****',
            'password'    => '****',
            'dbname'      => '*****'
        ));
        
        Zend_Db_Table_Abstract::setDefaultAdapter($this->db);

        $config = array(
            'name'           => '******',
            'primary'        => '*****',
            'modifiedColumn' => '*****',
            'dataColumn'     => '*****',
            'lifetimeColumn' => '******'
        );
         
         Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
      
       
        // Démarrage de la session
        Zend_Session::start();
    }

Code:

dans la page index si la page reste inactif pendant un certain temps la session doit être expirer et en redirige l'utilisateur vers la page login pour s'identifier de nouveau.

public function indexAction()
    {
   Zend_Session::rememberMe(300);
   Zend_Session:: destroy();

   if (Zend_Session:: isDestroyed() ){
    $this->_redirect('index/login');
        }
              
    }

la première chose l'utilisateur va se connecter a l'application si son login et password validées il va se redireger vers la page index .

Code:

public function loginAction() 
    {
        // If data was sent
        if(isset($_POST['login']) && !empty($_POST['login'])) {
    
           $user_model = new session2_MODEL_User($this->db);
    
           $message = $user_model->login($_POST['login'], $_POST['pass']);
           if (true === $message ) {
            // Successfully       
               $this->_redirect('index');              
           } else {
                 $this->view->assign('errors', $message);                 
            }
        }
    }

Dernière modification par 0866 (05-03-2012 11:24:24)

Hors ligne

 

#4 05-03-2012 11:47:49

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu][Zend_Session][8.0.0]expiration page

Alors il y a bien un truc que je comprend pas ... Lis les commentaires.

Code:

[lang=php]
public function indexAction()
    {
   Zend_Session::rememberMe(300); // Tu demandes 300 secondes de timeout
   Zend_Session:: destroy(); // Tu DETRUIS la session

   if (Zend_Session:: isDestroyed() ){ // Forcément la session est détruire donc tu passes dans le if et tu es redirigé
    $this->_redirect('index/login');
        }
              
    }

Hors ligne

 

#5 05-03-2012 14:29:47

0866
Membre
Date d'inscription: 02-04-2010
Messages: 27

Re: [Résolu][Zend_Session][8.0.0]expiration page

mon ideé c'est d'expirer la session après un certain temps (si la page index reste inactif pendant un abs de temps) et après l'expiration je redirige l'utilisateur vers la page login.
et j ne sait pas comment j doit l’implémenter.

Hors ligne

 

#6 05-03-2012 14:38:14

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu][Zend_Session][8.0.0]expiration page

Bah pas comme ça smile.

Si on décrypte ce qui se passe lorsque tu es sur la page index de ton contrôleur on a ça :

- J'indique à la session qu'elle doit se souvenir de moi pendant 300 secondes, soit 5 minutes
- Je détruis la session
- Si j'ai détruit la session je redirige.

Tu vois bien que tu fais un truc de trop, si tu demandes à la session de se souvenir de toi pendant 300 secondes mais que tu la détruis juste après lui avoir demandé ça ne sert à rien de lui dire de se souvenir de toi. La solution c'est donc de ne pas faire tout ça dans la même requête.

C'est lorsque l'utilisateur s'authentifie et que tu enregistre la session qu'il faut lui indiquer au bout de combien de temps elle expire et uniquement à cet endroit. Ensuite à toi de mettre en place un système d'autorisation et de vérification sur les contrôleurs qui nécessitent d'être connecté.

Pour ça tu peux faire un contrôleur générique qui va gérer ça et étendre tous tes contrôleurs avec cette classe là, du coup, à chaque requête tu vas pouvoir vérifier si la session est valide. Si l'utilisateur ne fait rien pendant 5 minutes, la session aura expiré et tu pourras alors faire la redirection que tu souhaites.

Je te conseil de lire la doc officielle qui est très bien faite sur les sessions : http://framework.zend.com/manual/fr/zend.session.html

Hors ligne

 

#7 07-03-2012 10:35:18

0866
Membre
Date d'inscription: 02-04-2010
Messages: 27

Re: [Résolu][Zend_Session][8.0.0]expiration page

dans l'action index j changé le code comme ce si:

Code:

 [lang=php]

 Zend_Session::rememberMe(15*60);       //attend 15 mn
  if (!Zend_Session::sessionExists()){
       Zend_Session:: destroy();
        $this->_redirect('index/pagetwo');       
  }

donc si la page reste inactif pour 15mn j fait la redirection vers une autre page.
mais cette redirection n se fait pas automatique si seulement si j fait actualiser la page (après 15mn).


est ce que il y a un truc qui doit l'ajouter ???

et comment j puisse faire informer l'utilisateur qui la page va être expiré après 15mn?

merci d’avance.

Hors ligne

 

#8 07-03-2012 11:44:08

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu][Zend_Session][8.0.0]expiration page

En fait il y a des choses que je ne comprend pas très bien dans ta démarche. (C'est des choses à vérifier car j'en suis pas certain mais ça serait de la logique).

Code:

[lang=php]
Zend_Session::rememberMe(15*60);

Permet de dire que tu veux que la session soit enregistrée pour 15 minutes. Cette information est envoyée avec un timeout à ton serveur web. Si l'utilisateur est inactif plus de 15 minutes alors le serveur va supprimer la session et ne pourra donc plus la retrouver. La session a donc expiré. Tu n'as donc pas besoin (en théorie) de faire un Zend_Session::destroy();

Ensuite ce qui ne va pas c'est que tu fais tout ça dans la même "action". Lorsque l'utilisateur va arriver sur ta page il va exécuter tous le code présent dans ton contrôleur (en tenant compte des ifs etc ...). Donc là ta page ne devrait pas expirer (à moins que tu fasses des choses au dessus que tu ne montres pas). Puisque dans l'ordre tu fais ça :

- J'indique à la session de rester active 15 minutes
- Je vérifie si la session n'existe pas
- Si elle existe pas je détruis la session (mais pourquoi détruire quelque chose qui n'existe pas ? (à confirmer mais ça me semble pas très logique qu'elle ne soit pas détruite toute seule))
- Si elle existe pas alors je redirige l'utilisateur

Le problème c'est qu'à chaque fois qu'un utilisateur va consulter ta page tu lui dis de garder la session 15 minutes. De ce fait elle ne devrait jamais expirer puisque même après 1h00 d'inactivité si je recharge la page tu demandes à la session de rester active 15 minutes et ensuite tu vérifies si elle existe. Elle devrait donc toujours exister puisque tu lui demandes toujours avant d'exister.

Je pense que tu as un problème de conception à ce niveau là. Sois tu créés la session via un formulaire de connexion et dans ce cas le Zend_Session::rememberMe(15*60); doit être dans ta fonction de connexion soit c'est une page spécifique qui ne peux être active qu'un certain temps et dans ce cas mettre en place un système qui va gérer la session sur cette page uniquement (je ne vois pas trop comment faire comme ça, car tu dois vérifier si la session existe, si elle existe pas la créer pour 15 minutes et si elle expire rediriger mais si elle a expiré elle n'existe plus, donc ça boucle ... A moins qu'il y ai moyen de différencier session inexistante de session expirée).

Si on reste sur l'idée de la session créée via un formulaire de connexion, tu as juste à laisser le code que tu as fait (en testant si le destroy() a une réelle utilité) et en retirant le rememberMe(15*60).

Pour informer l'utilisateur que la page va expirer après 15 minutes, tu peux l'indiquer directement sur la page, via le flashMessenger, etc ...

La page ne pourra pas être redirigée toute seule sans rien faire avec PHP. Tu peux le faire avec du javascript ou en modifiant une balise d'entête de ce genre (à voir comment le faire avec zend)

Code:

[lang=php]
<meta http-equiv="refresh" content="REDIRECT_TIME_EN_SECONDES -> 15*60";URL=DESTINATION_URL" />

Ceci va déclencher une redirection au bout de X secondes. Il faut que tu remplaces REDIRECT_TIME_EN_SECONDES par ton temps soit 15*60 + 1 secondes pour être au delà des 15 minutes et DESTINATION_URL par la page vers laquelle tu veux rediriger l'utilisateur.

Dernière modification par Orkin (07-03-2012 11:45:38)

Hors ligne

 

#9 07-03-2012 12:17:54

0866
Membre
Date d'inscription: 02-04-2010
Messages: 27

Re: [Résolu][Zend_Session][8.0.0]expiration page

Merci bq Orkin,

suite a votre recommandation qui tu a me donné.

j résolu mes problèmes smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages