2012-02-18 26 views
9

Estoy trabajando en una aplicación que contiene varias aplicaciones secundarias y me gustaría implementar una desconexión automática después de 30 minutos de inactividad. Tengo una AuthController con inicio de sesión y cierre de sesión acciones asignadas a la costumbre/rutas de acceso y/cierre de sesión utilizando el Bootstrap.php, así como un plugin controlador frontal que tiene este aspecto:Zend Framework Cierre de sesión automático después de la inactividad

class Plugin_SessionTrack extends Zend_Controller_Plugin_Abstract { 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 

     $employeeSession = new Zend_Session_Namespace('employeeSession'); 
     $employeeSession->setExpirationSeconds(10); 

    } 
} 

Soy nuevo en PHP y Zend , ¿qué está pasando exactamente con la sesión después de 10 segundos? Lo tengo bajo para probar. Lo que me gustaría que sucediera es que si la última solicitud a través del complemento del controlador frontal fue hace más de 30 minutos, destruya la sesión, cierre la sesión del usuario y rediríjalo a/login.

Veo, obviamente, que no estoy rastreando el momento de la última solicitud, pero esperaba que el setExpirationSeconds se actualizara cada vez que el usuario tuviera una solicitud para este método preDispatch.

¿Se necesita una cookie? No necesito iniciar realmente una acción de cierre de sesión, solo se puede manejar la próxima vez que el usuario haga una solicitud, si no han hecho nada en la última media hora, la sesión se destruye y se desconectan, lo que significa si me alejo durante 45 minutos, mi pantalla aún se ve igual, pero si hago clic en un enlace o intento enviar un formulario que tenía arriba, me envía a/login. Me puedo preocupar por algún tipo de advertencia de cuenta atrás JS más tarde.

Editar: Aquí está mi rutina de carga si alguien quiere verlo:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    /** 
    * Custom routes: 
    * 
    * /login 
    * /logout 
    */ 
    protected function _initRoutes() 
    { 

     $router = Zend_Controller_Front::getInstance()->getRouter(); 

     $loginRoute = new Zend_Controller_Router_Route('login', array('controller' => 'auth', 'action' => 'login')); 

     $logoutRoute = new Zend_Controller_Router_Route('logout', array('controller' => 'auth', 'action' => 'logout')); 

     $routesArray = array('login' => $loginRoute, 'logout' => $logoutRoute); 

     $router->addRoutes($routesArray); 

    } 

    protected function _initPlugins() 
    { 

     $frontController = Zend_Controller_Front::getInstance(); 
     $frontController->registerPlugin(new Plugin_SessionTrack()); 

    } 
} 
+0

Primero defina 'inactividad'. Todo lo que podemos ver en php son las solicitudes del servidor. Realmente odio sugerir esto, pero es posible que desee utilizar javascript para controlar la actividad y cuando se agote el tiempo, llame al método de cierre de sesión. La expiración del espacio de nombres no parece hacer lo que necesita. – RockyFord

+0

Inactividad significa que el usuario no ha enviado un formulario, no ha estado presionando acciones en el controlador. Básicamente están "lejos del teclado". Las aplicaciones secundarias de esta casa son bastante impulsadas por los datos, por lo que debería ser evidente que no están utilizando la aplicación si las cosas no están golpeando los controladores (acciones). –

Respuesta

11

Cuando se llama a Zend_Session::setExpirationSeconds(10), nada está sucediendo realmente a la sesión después de 10 segundos de tiempo de por sí.

Esta llamada hace que Zend_Session almacene un valor interno que marque ese espacio de nombres de sesión para su caducidad en time() + $seconds desde el momento en que se realiza la llamada. Cada vez que se inicia Zend_Session, se comprueba si los datos de la sesión están marcados para la caducidad y, si es así, se comprueba para ver si ha expirado el tiempo de caducidad o el recuento de saltos. Si ese es el caso, entonces los datos de la sesión en cuestión no están configurados en la inicialización y, por lo tanto, su aplicación ya no puede acceder a ellos.

Si realiza esta llamada al comienzo de cada solicitud, debe continuar prolongando la duración de la sesión en tantos segundos en cada carga de página.

Tenga en cuenta que si la configuración de la sesión en php.ini expira la sesión después de 15 minutos, establecer un espacio de nombre para caducar después de 60 minutos no anulará la duración de la sesión de PHP de 15 minutos. Puede hacer tales ajustes a las directivas de sesión de PHP en su archivo application.ini.

Establecer una caducidad en el espacio de nombres también tiene la ventaja de eliminar automáticamente algunos datos de sesión sin tener que destruir toda la sesión.

No conozco las características específicas de su aplicación, pero podría usar el complemento para verificar y ver si se cerraron la sesión y reenviar la solicitud a su página de inicio de sesión. Puede verificar un inicio de sesión válido después de crear el espacio de nombres, pero también debe asegurarse de que la solicitud actual no sea un intento de inicio de sesión. O bien, podría diferir la verificación de un inicio de sesión válido en el complemento y dejar que su ACL maneje eso más adelante en el nivel del controlador.

Es posible que también desee consultar Zend_Auth que puede utilizar para conservar una identidad en la sesión. La identidad puede ser cualquier cosa, desde un simple valor booleano que indica si están conectados, hasta un objeto de usuario completo que implementa Zend_Acl_Role_Interface.Zend Auth también se puede ampliar fácilmente para que pueda tener varias sesiones de Zend_Auth activas al mismo tiempo al usar diferentes espacios de nombres para cada instancia, y puede hacer que su clase de autenticación personalizada establezca diferentes límites de tiempo en espacios de nombres de sesión diferentes.

Espero que eso ayude a responder su pregunta, siéntase libre de comentar si tiene alguna pregunta sobre lo que dije.

EDIT:

He probado el siguiente código y expiró con éxito mi identidad Zend_Auth después de la hora fijada. Lo probé bajo con 60 segundos y después de esperar 60 segundos para cargar la página, ya no tenía identidad y estaba "desconectado". Puede agregar esto a su plugin de pista de sesión.

<?php 
$auth = Zend_Auth::getInstance(); 

if ($auth->hasIdentity()) { // user is logged in 
    // get an instance of Zend_Session_Namespace used by Zend_Auth 
    $authns = new Zend_Session_Namespace($auth->getStorage()->getNamespace()); 

    // set an expiration on the Zend_Auth namespace where identity is held 
    $authns->setExpirationSeconds(60 * 30); // expire auth storage after 30 min 
} 
+0

https://gist.github.com/8b2ae80e23543a34ca8a Existe mi acción de inicio de sesión. Estoy usando un adaptador Zend_Auth para autenticarlos a través de Active Directory. Lo tengo todo funcionando, excepto para poder forzar el cierre de sesión de su usuario si la última acción que realizaron en el sitio fue hace más de 30 minutos. –

+0

Más adelante en su aplicación, ¿qué hace para verificar si un usuario ha iniciado sesión? ¿Verifica que la identidad de la autenticación no sea nula? Vea mi respuesta actualizada que muestra cómo caducar la identidad de Zend_Auth. Espero que sea eso lo que estabas buscando. – drew010

+0

Sí más tarde, si necesito ver si están conectados, simplemente obtengo getIdentity() y veo cómo se ve. Entonces, al configurar $ authns para que expire en 30 minutos, ¿esto hará que getIdentity() previamente bueno cambie a nulo? –

Cuestiones relacionadas