Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 05-08-2018 12:54:09

JoeBoo
Nouveau membre
Date d'inscription: 24-09-2011
Messages: 2

Session expire after idle timeout

Bonjour,

Je suis passé de ZF1 à ZF3.
Cela fait environ 1 mois que j'utilise le ZF3.

La version de PHP utilisée est la 7.2

En utilisant le ZF3 je me suis rendu compte que la durée de mes sessions étaient de 30 minutes (gc_maxlifetime ==> 1800, cookie_lifetime ==> 1800),
même si il n'y avait pas de idle time.

Dans le ZF1 j'utilisais la méthode Zend_Session_Namespace::setExpirationSeconds dans le bootstrap.

Dans le ZF3 on peut utiliser \Zend\Session\SessionManager::rememberMe mais le problème c'est que cette méthode appel $this->regenerateId();

J'ai trouvé une solution à partir des sources ci-dessous
    https://shuggill.wordpress.com/2011/08/ … framework/
    https://olegkrivtsov.github.io/using-ze … book/html/

Ci-dessous un extrait de global.php

Code:

[lang=php]
<?php

$sRealPath = realpath(__DIR__ . "/../..");

return [
    //...
    'php_settings' => [
        'date.timezone'            => 'Europe/Paris',
        'display_startup_errors'   => 0, //mis à 1 dans users.dev.php
        'display_errors'           => 0, //mis à 1 dans users.dev.php
        'log_errors'               => 1,
        ' use_strict_mode'         => 1,
        'error_log'                => "{$sRealPath}/data/log/error.log",
        'error_reporting'          => E_ALL | E_STRICT,
    ],

    'session_config' => [
        'name'              => 'MY_SESSION_NAME', //Pas la vrai valeur, juste un exemple
        'use_cookies'       => true,
        'use_trans_sid'     => false,
        'cookie_httponly'   => true,
        'save_path'         => "{$sRealPath}/data/session/",
        'cookie_path'       => '/',
        'cookie_lifetime'   => 3600 * 24 * 7, //1 semaine
        'gc_maxlifetime'    => 3600 * 24 * 7, //1 semaine
        'gc_probability'    => 1,
        'gc_divisor'        => 1,
        'config_class'      => \Zend\Session\Config\SessionConfig::class,

    ],
    'session_manager' => [
        'validators' => [
            RemoteAddr::class,
            HttpUserAgent::class,
        ],
    ],
    'session_storage' => [
        'type' => SessionArrayStorage::class,
    ],
    'application_settings' => [
        'app_name'         => "MY_APP_NAME",         //Pas la vrai valeur, juste un exemple
        'app_description'  => "MY_APP_DESCRIPTION",  //Pas la vrai valeur, juste un exemple
        'app_skin'         => "skin1",
        'app_path_cache'   => "{$sRealPath}/data/cache/",
        'app_path_log'     => "{$sRealPath}/data/log/",
        'app_path_upload'  => "{$sRealPath}/data/upload/",
        'app_path_session' => "{$sRealPath}/data/session/",
        'app_path_css'     => "{$sRealPath}/public/css/",

        //Pour l'exemple j'ai mis 30 secondes.
          //Lorsque je rafraîchie la page après 30 secondes d'inactivités je suis redirigé vers le formulaire de login
          //Si je rafraîchie sans cesse la page tout est OK même après 30 secondes
        'idle_timeout'     => 30,

        //Logger
            //"off"  ==> pour désactiver
            //"0"    ==> Emergency:      system is unusable                  Tous ce qui est <= à 0
            //"1"    ==> Alert:          action must be taken immediately    Tous ce qui est <= à 1
            //"2"    ==> Critical:       critical conditions                 Tous ce qui est <= à 2
            //"3"    ==> Error:          error conditions                    Tous ce qui est <= à 3
            //"4"    ==> Warning:        warning conditions                  Tous ce qui est <= à 4
            //"5"    ==> Notice:         normal but significant condition    Tous ce qui est <= à 5
            //"6"    ==> Informational:  informational messages              Tous ce qui est <= à 6
            //"7"    ==> Debug:          debug messages                      Tous ce qui est <= à 7
            //"8"    ==> Spec:           spécification                       Tous ce qui est <= à 8
            //"9"    ==> Spec store:     spécification store éléments        Tous ce qui est <= à 9
        'app_log_severity' => '7',
        'err_log_severity' => '7',
    ],
    //...
];

Ci-dessous un extrait de Application/src/Module.php

Code:

[lang=php]
<?php
//...
class Module implements ConfigProviderInterface, BootstrapListenerInterface {
    const VERSION = '3.0.3-dev';

    public function getConfig() {
        return include __DIR__ . '/../config/module.config.php';
    }

    public function onBootstrap(EventInterface $oEvent) {
        /*@var $oApp  \Zend\Mvc\Application */

        $oApp    = $oEvent->getApplication();
        $oSrvMgr = $oApp->getServiceManager();
        $oEvtMgr = $oApp->getEventManager();
        $aConfig = $oSrvMgr->get("configuration");

        $this->initPhpSettings($aConfig);

        $this->handleSession($oSrvMgr, $aConfig);

        AbstractValidator::setDefaultTranslator(new Translator($oSrvMgr->get('translator')));

        // Make sure our module router listens to our event manager as well
        (new ModuleRouteListener())->attach($oEvtMgr);

        (new ErrorListener())->attach($oEvtMgr);
        (new InitViewListener())->attach($oEvtMgr);
        (new AclListener())->attach($oEvtMgr);
    }


//--Helpers

    protected function initPhpSettings(array $aConfig) {
        if(!array_key_exists('php_settings', $aConfig)) {
            return;
        }

        foreach($aConfig['php_settings'] as $sPhpSetting => $sValue) {
            ini_set($sPhpSetting, $sValue);
        }
    }

    protected function handleSession(ServiceManager $oSrvMgr, array $aConfig) {
        $sKeyName = 'idle_timeout';

        try {
            /*@var $oSsnMgr \Zend\Session\SessionManager */
            // The following line instantiates the SessionManager and automatically
            // makes the SessionManager the 'default' one.
            $oSsnMgr = $oSrvMgr->get(SessionManager::class);

            Container::setDefaultManager($oSsnMgr);

            $oSsnMgr->start();

            if(!array_key_exists('session_config', $aConfig)) {
                $oSrvMgr->get('ApplicationLogger')->debug("****** SESSION CONFIG NOT FOUND ******");

                return;
            }

            $aConfig = $aConfig['application_settings'];
            if(!array_key_exists($sKeyName, $aConfig)) {
                $oSrvMgr->get('ApplicationLogger')->debug("****** {$sKeyName} NOT FOUND ******");

                return;
            }

            $iIdleTimeout = (int) $aConfig[$sKeyName];

            $oStorage = $oSsnMgr->getStorage();

            if($oStorage->offsetExists($sKeyName)) {

                $iLimit = $oStorage->offsetGet($sKeyName);
                if($iLimit < time()) {

                    $oSrvMgr->get('ApplicationLogger')->debug("****** SESSION TIME OUT DETECTED REDIRECT TO LOGIN ******");

                    $oSsnMgr->destroy();
                    $oSsnMgr->regenerateId();
                    header('Location: /');
                    exit();
                }
            }

            $oStorage->offsetSet($sKeyName, time() + $iIdleTimeout);

        } catch(\Exception $oEx) {

            $oSrvMgr->get('ErrorLogger')->debug($oEx->getMessage());

            /**
             * Session validation failed: toast it and carry on.
             */
            // @codeCoverageIgnoreStart
            session_unset();
            // @codeCoverageIgnoreEnd
        }
    }
//...
}

Cela a l'air de fonctionner correctement qu'en pensez-vous ?

Existe t-il un autre moyen d'implémenter ceci ?

Dernière modification par JoeBoo (05-08-2018 12:56:59)

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