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

Zend_Acl & Zend_Auth PHP Discussion :

[Zend_Auth] Durée de conservation de l'authentification


Sujet :

Zend_Acl & Zend_Auth PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut [Zend_Auth] Durée de conservation de l'authentification
    Bonjour,
    Je voudrais gérer le temps de validité de l'authentification,
    par exemple au bout de 30 minutes d'inactivité, l'utilisateur doit se reconnecter.

    Pour ce faire j'ai créer une nouvelle classe de stockage pratiquement identique à la classe de base (Zend/Auth/Storage/Session.php). J'ai juste ajouté cette fonction qui fixe la durée d'expiration en seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function setDurationSeconds($sec)
        {
        $this->_session->setExpirationSeconds($sec);
        }
    Je pensait obtenir ce que je souhaitait mais en fait mes sessions se ferme au bout de 30 minutes même si l'utilisateur est actif.

    Pour réinitialiser le temps j'utilise ce bout de code dans mes contrôleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $auth = Zend_Auth::getInstance();
    require_once 'Zend/Auth/Storage/TimedSession.php';
    $storage = new Zend_Auth_Storage_TimedSession();
    $storage->setDurationSeconds(30);
    $auth->setStorage($storage);
    Je trouve cette méthode un peu "lourde", Qu'en pensez vous ?

    Merci.

  2. #2
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bonjour,

    ce n'est pas une solution que j'ai testée, mais voici comment je procèderais :
    • Faire de Zend_Auth_Storage_TimedSession une classe fille de Zend_Auth_Storage_Session
    • Créer un champ $_duration dans la classe Zend_Auth_Storage_TimedSession initialisé par la méthode setDurationSeconds()
    • Surcharger la méthode Zend_Auth_Storage::read() (puisqu'elle est appelée par Zend_Auth::getIdentity(), c'est là qu'il faut relancer le compteur de durée de la session)

    Ca devrait donner un truc du genre :
    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
    class Zend_Auth_Storage_TimedSession extends Zend_Auth_Storage_Session
    {
      protected $_duration;
      public function setDurationSeconds($sec)
      {
        $this->_duration = $sec;
        $this->_session->setExpirationSeconds($this->_duration);
      }
      public function read()
      {
        if (isset($this->_duration)) {
          $this->_session->setExpirationSeconds($this->_duration);
        }
        return parent::read();
      }
    }
    Ainsi, il n'y a plus qu'à initialiser la durée dans le bootstrap, et ce sera transparent pour les contrôleurs.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut
    Bonjour,
    d'abord merci pour tes conseil, j'ai ajouter la classe fille et voici ce que j'ai mi dans mon bootstrap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    require_once('Zend/Auth/Storage/TimedSession.php');
    $storage = new Zend_Auth_Storage_TimedSession();
    $storage->setDurationSeconds(10);
    Zend_Registry::set('storageTest', $storage);
    Dans mon contrôleur d'authentification j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function loginAction() {
    		$storage = Zend_Registry::get('storageTest');
    		$auth = Zend_Auth::getInstance();
    		$auth->setStorage($storage);
    		...
    }
    Dans mes autres contrôleurs j'ai juste dans le preDispatch :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $auth = Zend_Auth::getInstance();
    		if(!$auth->hasIdentity())
    			{
    			$this->_redirect('auth/login');
    			}
    J'obtient bien ce que je veux alors que je ne fait pas appel a getIdentity() ?

    Par contre si j'enlève le code du bootstrap et que je le met dans loginAction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function loginAction() {
    		require_once 'Zend/Auth/Storage/TimedSession.php';
    		$storage = new Zend_Auth_Storage_TimedSession();
    		$storage->setDurationSeconds(10);
    		$storage = Zend_Registry::get('storageTest');
    		$auth = Zend_Auth::getInstance();
    		$auth->setStorage($storage);
    }
    Je n'ai plus le même comportement, mes sessions ce ferme même si j'utilise l'applis ?

    De plus si je fais un print_r($auth) dans loginAction j'ai bien un objet Zend_Auth_Storage_TimedSession, si je le fait dans un autre contrôleur j'ao Zend_Auth_Storage_Session.

    Je suis un peu perdu là...?

  4. #4
    Expert confirmé
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Bon, on va essayer d'y voir un peu plus clair...

    Tu dois procéder à l'initialisation complète (y compris le stockage dans la session) de l'objet d'authentification dans ton bootstrap, et stocker cet objet dans le registre pour pouvoir y accéder à partir de tes contrôleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    require_once('Zend/Auth/Storage/TimedSession.php');
    $storage = new Zend_Auth_Storage_TimedSession();
    $storage->setDurationSeconds(10);
    $auth = Zend_Auth::getInstance();
    $auth->setStorage($storage);
    Zend_Registry::set('auth', $auth);
    Dans le preDispatch() de tes contrôleurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $auth = Zend_Registry::get('auth');
    if(!$auth->hasIdentity())
    {
      $this->_redirect('auth/login');
    }
    Dans ton contrôleur d'authentification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function loginAction() {
      $auth = Zend_Registry::get('auth');
      ...
    D'après ton code, c'est en fait Zend_Auth::hasIdentity() qui est censé remettre à zéro le timer de la session ; hasIdentity() appelant Zend_Auth_Storage_TimedSession::isEmpty(), cette méthode doit donc aussi relancer le décompte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      public function isEmpty()
      {
        if (isset($this->_duration)) {
          $this->_session->setExpirationSeconds($this->_duration);
        }
        return parent::isEmpty();
      }
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 38
    Par défaut
    Ok ça marche, Merci !

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Bonjour,

    J'ai eu moi aussi besoin de cette fonctionnalité de session d'authentification temporaire, et j'ai donc étudié de près ce sujet.

    Ci-dessous ma démarche, pouvez-vous me dire si je ne me suis pas planté dans mes conclusions ? Merci d'avance !

    1. Si on met ce code dans le bootstrap :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      require_once('Zend/Auth/Storage/TimedSession.php');
      $storage = new Zend_Auth_Storage_TimedSession();
      $storage->setDurationSeconds(10);
      $auth = Zend_Auth::getInstance();
      $auth->setStorage($storage);
      A chaque consultation d'une page, on définis la durée de conservation de la session, et par là même on la réinitialise. Est-il alors vraiment utile de surcharger la fonction isEmpty de Zend_Auth_Storage_Session ?



    1. En allant plus loin, je me suis demandé si la surcharge de la classe Zend_Auth_Storage_Session était nécessaire. En récupérant le namespace d'authentification et en mettant à jour son délai d'expiration, on devrait arriver au même résultat...

      Voici le code du bootstrap auquel je suis arrivé :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      $storage = new Zend_Auth_Storage_Session();
      $sessionNamespace = new Zend_Session_Namespace($storage->getNamespace());
      $sessionNamespace->setExpirationSeconds(10);
      $auth = Zend_Auth::getInstance();
      $auth->setStorage($storage);
      Qu'en pensez-vous ? Voyez-vous un inconvénient à cette méthode par rapport à la surcharge de Zend_Auth_Storage_Session ?


    Merci !

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

Discussions similaires

  1. [Zend_Auth] + PDO_MSSQL : problème d'authentification
    Par MaitreTsiang dans le forum Zend_Db
    Réponses: 13
    Dernier message: 30/09/2011, 18h25
  2. Zend_auth - Avoir deux authentification sur deux appli Zend
    Par Jonathan.b dans le forum Zend_Acl & Zend_Auth
    Réponses: 16
    Dernier message: 07/08/2008, 21h10
  3. Durée de conservation des logs sur un HotSpot
    Par tiotel dans le forum Hardware
    Réponses: 3
    Dernier message: 19/04/2007, 11h17

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