Foros del Web » Programando para Internet » PHP » Zend »

Zend_Session y Zend_Auth logueado solo una vez.

Estas en el tema de Zend_Session y Zend_Auth logueado solo una vez. en el foro de Zend en Foros del Web. Hola Gente! Estoy armando un sistema en Flash Builder de backend tengo PHP y Zend Framework . Tengo una duda con las sessiones y Zend_Auth. ...
  #1 (permalink)  
Antiguo 19/03/2012, 08:44
 
Fecha de Ingreso: mayo-2003
Ubicación: Mar del Plata
Mensajes: 373
Antigüedad: 20 años, 11 meses
Puntos: 0
Zend_Session y Zend_Auth logueado solo una vez.

Hola Gente!

Estoy armando un sistema en Flash Builder de backend tengo PHP y Zend Framework .

Tengo una duda con las sessiones y Zend_Auth.
Hoy me di cuenta que seria bueno que en mi sistema los usuarios se logueen una sola vez, es decir que no puedan abrir multiples instancias (inclusive desde diferentes lugares) de su session con su usuario. En caso de loguearse exitosamente lo que deberia hacer el sistema es desloguear la ultima session inicializada con este usuario aunque aun no se haya vencido y que en la session anterior muestre una ventana indicando que inicializo session desde otra ubicacion, al mejor estilo msn.

este es el trozo de codigo donde guardo la session en caso de que la autenticacion haya sido exitosa:

Código PHP:

//Escribimos los datos del usuario en el storage
$auth->getInstance()->getStorage()->write($userInfo);
                
//Creamos una session para recordar el usuario
//Zend_Session_Namespace object

require_once('Zend/Session/Namespace.php');
$session = new Zend_Session_Namespace('session');

//Recordar por un dia completo
$session->setExpirationSeconds(24*3600);

//Recordar usuario (aunque cierre el navegador)
Zend_Session::rememberMe(); 
Alguien podria guiarme con este tema? gracias!
  #2 (permalink)  
Antiguo 19/03/2012, 18:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

Vas a tener que manejar un registro persistente para la sesión (una base de datos funciona bien), y ahí guardar la IP desde donde esta haciendo la conexión, y seguramente con el UserAgent para que sea más único el registro, y posteriormente haces un query para ver sí ya inició la sesión, y en ese caso, desconectarlo y forzarlo a que vuelva a entrar, o algún mecanismo similar.

Saludos.
  #3 (permalink)  
Antiguo 20/03/2012, 06:00
 
Fecha de Ingreso: mayo-2003
Ubicación: Mar del Plata
Mensajes: 373
Antigüedad: 20 años, 11 meses
Puntos: 0
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

Hola GatorV

Parece que no es un tema tan recurrido por el cual consulto!
Ayer estuve leyendo bastante sobre lo que quiero hacer, ademas ahora leo tu respuesta y coincide totalmente, voy a tener que usar bases de datos para poder llevar un control mas preciso de las sessiones en el sistema. Ademas lei que:

-Son un poco peligrosas a la hora de usarlas en un shared Host, debido a que los archivos de sessiones almacenados por php pueden ser vistos por cualquiera que tenga acceso al directorio donde los guardo.

-Es muy facil de lograr robo de identidades mediante hijacking...

Entonces como me comentas, para agregar un poco de seguridad seria bueno cambiar el directorio donde guardo las sessiones y podria tomar en cuenta el ip desde donde se inicia la session como para compararlo en cada ejecucion de la aplicacion.

Lei que existe la clase Zend_Session_SaveHandler_DbTable. Mediante parametros le indico a esta en que tabla guardo la informacion y zend se encarga de ir almacenandolo automaticamente.

Segun la siguiente documentacion http://framework.zend.com/wiki/displ...andler_DbTable deberia crear una tabla en la DB

Código:
CREATE TABLE `Sessions` (
`id` varchar(32) NOT NULL,
`modified` int(11) default NULL,
`lifetime` int(11) default NULL,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
y implementarla de la siguiente manera:

Código PHP:
<?php
//This is in your bootstrap, note you can also use Zend_Config in the constructor
$config = array(
'name'           => 'session',      //table name as per Zend_Db_Table
'primary'        => 'Session_ID',   //the sessionID given by php
'modifiedColumn' => 'modified',     //time the session should expire
'dataColumn'     => 'Session_data'//serialized data
'lifetimeColumn' => 'lifetime'      //end of life for a specific record
);
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
Zend_Session::start();
?>

Mi duda es la siguiente, si bien hago uso de sessiones en ningun momento hago un Zend_Session::start(); en mi codigo... esto deberia ir apenas inicializo mi aplicacion?


Ademas para saber rapidamente si un usuario tiene una session abierta deberia crear un campo en la tabla usuarios llamado por ejemplo "session_id" donde guarde el id de la session creada?

Gracias de antemano por el tiempo y la experiencia que comparten!
  #4 (permalink)  
Antiguo 20/03/2012, 10:07
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

Exacto, en un shared host corres ese "riesgo" por eso es mejor tener la sesión en una base de datos, así "mitigas" un poco ese riesgo.

La idea es que en esa misma tabla de sesiones, también guardes a lo mejor el user_id y el último tiempo de conexión, junto con la IP a lo mejor, de esa forma puedes ver sí esta "activo" o no "activo", de esa forma puedes desconectar al usuario y pedirle que vuelva a iniciar sesión...
  #5 (permalink)  
Antiguo 20/03/2012, 14:12
 
Fecha de Ingreso: mayo-2003
Ubicación: Mar del Plata
Mensajes: 373
Antigüedad: 20 años, 11 meses
Puntos: 0
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

Hola Vgator

Gracias nuevamente por responder.

Te cuento que he implementado Zend_Session_SaveHandler_DbTable y funciona correctamente, ya las sessiones se estan almacenando de forma satisfactoria en la tabla sessiones.

Para poder mantner solo una session por cada usuario logueado lo que hice fue agregar un campo mas a la tabla usuarios llamado session_id, alli guardare el id de la ultima session que autentico correctamente.

Cuando el usuario hace loguin desde otro sitio o otro navegador, reemplazo este campo por el nuevo id de la session, y el antiguo valor de la session lo utilizo para hacer un DELETE de la tabla sessions en la DB. De esta forma siempre queda logueado el usuario en un solo lugar y desconecta la anterior session reemplazandola por la ultima creada.

Aqui pego el trozo de codigo modificado en el Login

Código PHP:
//En $userInfo guardo todos los campos del usuario obtenidos de la DB
//luego de una autenticacion satisfactoria.
$userInfo $adapter->getResultRowObject();

//Id de la session actual
$id_session Zend_Session::getId();
                    
//Si existe una session anterior la eliminamos
if($userInfo->session_id != NULL){
    
$stmt $this->pdo->prepare("DELETE FROM sessions WHERE id=?");
    
$stmt->bindParam(1$userInfo->session_idPDO::PARAM_STR);
    
$stmt->execute();
}
                    
//Agregamos el nuevo identificador de la session
$stmt $this->pdo->prepare("UPDATE usuarios SET session_id=? WHERE id=?");
$stmt->bindParam(1$id_sessionPDO::PARAM_STR);
$stmt->bindParam(2$userInfo->idPDO::PARAM_INT);
$stmt->execute(); 
Tengo dos consultas sobre este tema:

Si uso la clase Zend_Session_SaveHandler_DbTable las sessiones pasan de almacenarse de la manera tradicional en php a usar las bases de datos? o se sigue haciendo uso del almacenamiento de archivos en el servidor para guardar las sessiones?

Cuando entro al sistema, sin loguearme, tambien se genera en la base de datos una nueva session. Si bien esta vacia se genera un nuevo registro con un nuevo id. Esto podria evitarse? es normal que se generen sessiones con usuarios Guests o desconocidos ?

Saludos y gracias!
  #6 (permalink)  
Antiguo 20/03/2012, 16:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

A tus preguntas:

1.- No, al cambiar el save handler, ya no se generan archivos para la sesión.

2.- Las sesiones se crean al llamar a Zend_Session::start(), por lo que solo inicia la sesión cuando realmente necesites autentificar a un usuario, no la crees para los guests.

Saludos.
  #7 (permalink)  
Antiguo 09/06/2012, 15:37
Avatar de malconsoft  
Fecha de Ingreso: septiembre-2011
Ubicación: Lima, Peru
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

Hola GatorV,
Eh tratado hacer lo que dices en el punto numero dos. Pero aun no indentifico como hacerlo.
¿ como hago para solo crear la session para un usuario autentificado y no para los guests.?

gracias
  #8 (permalink)  
Antiguo 10/06/2012, 18:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Zend_Session y Zend_Auth logueado solo una vez.

Pues simplemente llama a Zend_Session::start() solamente cuando hagas el login del usuario, y no cuando un usuario común entre a tu web.

Saludos.

Etiquetas: framework, logueado, php, zend-session
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:17.