Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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
[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
[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