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

  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 !

  7. #7
    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
    Citation Envoyé par Eusebe Voir le message
    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 ?
    Bien vu !
    Citation Envoyé par Eusebe Voir le message
    Qu'en pensez-vous ? Voyez-vous un inconvénient à cette méthode par rapport à la surcharge de Zend_Auth_Storage_Session ?
    A priori non, ça paraît effectivement être une meilleure alternative. Tu l'as testée ?
    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

  8. #8
    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
    Citation Envoyé par GrandFather Voir le message
    A priori non, ça paraît effectivement être une meilleure alternative. Tu l'as testée ?
    Oui, je l'ai testée, et ça a l'air de fonctionner.

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 360
    Par défaut
    Merci pour ces informations, ça marche vraiment...

  10. #10
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 97
    Par défaut
    Bonjour,
    merci pour votre solution,
    Je suis bien déconnecté au bout de x secondes.

    Mais je veux également mettre en place un message d'erreur a la déconnexion exemple : Vous avez été déconnecter de notre site a cause de votre temps d'inactivité.

    J'aimerai savoir si cela est possible merci.

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    Perso, j'ai créé un plugin qui s'occupe de toutes ces questions de sécurité : vérification de l'authentification, des acl, du timeout, de l'utilisation de l'https... le tout en pre-dispatch.
    Du coup, dans de risque de l'oublier dans un controller ou une action, et on reste DRY.

  12. #12
    Membre confirmé
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 97
    Par défaut
    J'utilise également un plug in pour auth et acl.
    Mais mon problème lors de ma déconnexion automatique quand zend_auth supprime la session. Je veux rajouter un message d'erreur sur flash_messenger.

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 278
    Par défaut
    En cas de timeout, mon plugin fait juste une redirection vers mon action 'timeout'. Celle-ci envoie les données à la vue puis détruit la session (=> déconnecte).

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 9
    Par défaut
    Merci, ca marche.

+ 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