Hay alguna manera de saber si un usuario esta "en linea"?

Hola,

Esta consulta viene relacionada por este otro post (http://comunidad.siu.edu.ar/index.php?topic=1573.0) … por lo que vi, no hay una manera directa, pero algo se podria llegar a inventar … ideas?

En realidad aun no comprendo muy bien el otro tema… pero en cuanto lo tenga mas claro seguramente los pueda ayudar mejor.
De todas maneras, el tema con saber cuando un usuario esta en linea o no se me ocurre tiene las siguientes complicaciones:

  • En php no puedo saltar de una sesion a otra recorriendo todas las abiertas para verificar que usuarios estan activos. Si asi fuera que lindo punto para hacer una escalada de privilegios dentro del proyecto.

  • Si marco el usuario en bd cuando esta activo y este en lugar de cerrar la sesion, me cierra el browser… yo no me entero… el usuario queda bloqueado hasta que la sesion expira por tiempo.
    Podria pensar en un esquema de liberacion por tiempo.
    Tiempo Largo: Usuario bloqueado, usuario final… descontento con tus parientes
    Tiempo Corto: Usuario disponible, me corta la sesion a mitad de una operacion… usuario final descontento con tus parientes.

  • Ademas un usuario puede abrir simultaneamente el sistema en IE, FF y Opera… y todas son sesiones validas, no le puedo negar dicho paralelismo.

No se si mas o menos se entiende cuales podrian ser las problematicas… de todas formas seguramente cuando entienda mejor el otro hilo probablemente relea esto para ver si tiene sentido o agarre para cualquier lado XD.

Saludos
Richard

Hola Richard … gracias por la respuesta…

Lo que se desea, es evitar exactamente dicho paralelismo que comentas, pero en distintos equipos… una manera forzada de quitar la costumbre de prestar las claves… y que el esquema de auditoria tenga sentido… por que si somos todos el mismo usuario, poco tiene sentido registrar que hiso cada uno… en castellano… queremos que ya que no lo entienden por las buenas, lo entiendan por las malas, el sistema no los deja!.

Para permitir que el usuario habra el sistema en 2 browsers a la vez… pero en el mismo equipo, se puede controlar controlar el REMOTE_ADDR que segun veo esta en la tabla de sesion.

Sobre tu idea de leer la tabla apex_sesion_browser… para capturar si esta conectado en linea o no, y calcular el tiempo de caida de sesion… por si solo cerro el browser (o se le pincho!). Para solventar el problema de que el tiempo sea muy largo, podemos jugar otra vez como ya comente, con la IP del cliente, si el cliente, trata de acceder nuevamente desde la misma IP, no hay problema.
Para completar, podemos presuponer algo para ser un poco mas optimistas, un usuario suele trabajar casi toda la jornada en un mismo equipo… asi que no deberia cambiar su IP.
Como primer impedimento, no se como tomar la variable del timeout de sesion que tiene configurado PHP en runtime, para hacer el calculo, sino YA… haria una prueba… (fanatico).

Me gustaria seguir escuchando opiniones… y un poco de ayuda… saludos!

Generalmente no se recomienda usar el IP del cliente ya que este puede estar detrás de un NAT y varias PCs reusan el mismo IP. Pero si sabes de antemano que el uso del sistema es una red sin NAT no habría problemas.

Para saber los timeouts, hay 3 que trabajan en conjunto:

La duración de la cookie que se envia al cliente, la sacas con

echo ini_get('session.cookie_lifetime');

Generalmente esta en 0 que indica ‘hasta que se cierra el browser’

La duración de la cookie en el servidor

echo ini_get('session.cookie_lifetime');

Despues de este tiempo sin modificar la sesión (es decir sin acceder) se borra la cookie en el servidor

La duración máxima de la sesión en toba (puede ser vacio que indica que no aplica)

echo toba::proyecto()->get_parametro('sesion_tiempo_no_interac_min')

Grandioso, hay algun metodo dentro del Toba, para consultar la tabla de sesion… o hay que hacerlo by hand?.. si es by hand… yo me encargo…

Hola.
En mi caso particular, antes de usar Toba, tuve la necesidad de ver que usuarios estaban conectados y desde donde.
Dado que para acceder a los distintos sistemas se pasaba por unos formularios de login que efectuaban una serie de controles generando variables de sesión, y dado que estas variables son almacenadas dentro de un archivo temporal en un subdirectorio del servidor (uno por cada sesión activa), armé un programa que se ajusta específicamente a mi caso, lo cual no quita que pueda servirte de guia.
Lo cuelgo a continuación (la parte que busca la información) con la esperanza de que te sirva de algo.

include "../Comunes/conexion.php"; $archs=array(); $ruta=session_save_path(); if (is_dir($ruta)): if ($gd = opendir($ruta)): while (($archivo = readdir($gd)) !== false) { if (filetype($ruta."/".$archivo)!="dir"): $contenido=explode(";",file_get_contents($ruta."/".$archivo),10); if(substr($contenido[2],0,8)==="prg_orig"): // este control sirve para ver si es un archivo creado por alguno de mis sistemas o no. "prg_orig" es una de mis variables de sesión. list($filler,$programa)=explode('"',$contenido[2]); list($filler,$ip)=explode('"',$contenido[4]); list($filler,$usuario)=explode('"',$contenido[5]); list($filler,$apyn)=explode('"',$contenido[6]); list($filler,$nivel)=explode('"',$contenido[7]); list($filler,$cdep)=explode('"',$contenido[8]); list($filler,$ldep)=explode('"',$contenido[9]); array_push($archs,array("programa"=>$programa, "usuario"=>$usuario, "ip"=>$ip, "nombre"=>$apyn, "nivel"=>$nivel, "cdep"=>$cdep, "ldep"=>$ldep, "horacon"=>$hora=date("H:i:s", filemtime($ruta."/".$archivo)))); endif; endif; } closedir($gd); endif; endif;

foreach($archs as $clave=>$fila) {
$programav[$clave]= $fila[‘programa’];
$ipv[$clave]= $fila[‘ip’];
$usuariov[$clave]= $fila[‘usuario’];
$nombrev[$clave]= $fila[‘nombre’];
$nivelv[$clave]= $fila[‘nivel’];
$cdepv[$clave]= $fila[‘cdep’];
$ldepv[$clave]= $fila[‘ldep’];
$horaconv[$clave]= $fila[‘horacon’];
}
array_multisort($programav, SORT_ASC, $horaconv, SORT_DESC, $usuariov, SORT_ASC, $nombrev,$nivelv,$cdepv,$ldepv,$ipv,$archs);

Un cordial saludo.