Foros del Web » Programando para Internet » PHP »

Evitar 2 ingresos simultaneos con el mismo usuario

Estas en el tema de Evitar 2 ingresos simultaneos con el mismo usuario en el foro de PHP en Foros del Web. Buenas tardes, estoy trabajando en un sistema que permite el ingreso de usuarios con distintos perfiles y permisos. Me gustaría saber una forma de hacer ...
  #1 (permalink)  
Antiguo 16/10/2010, 10:24
 
Fecha de Ingreso: mayo-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 1
Pregunta Evitar 2 ingresos simultaneos con el mismo usuario

Buenas tardes, estoy trabajando en un sistema que permite el ingreso de usuarios con distintos perfiles y permisos.

Me gustaría saber una forma de hacer que, si inicio sesión con el nombre de usuario 'admin1' e intento hacerlo desde otra computadora (es en ambiente web) me impida el ingreso al sistema ya que el usuario está en uso.

El proyecto es en php con Postgres.

Gracias.
  #2 (permalink)  
Antiguo 16/10/2010, 10:36
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 11 meses
Puntos: 89
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Podrías agregar un campo en tu tabla, llamado, por ejemplo, 'activo', en el cual le pondrías '1' si el usuario está logueado, y '0' si no lo está. Si intenta ingresar desde otra máquina, y el valor es '1', le prohibes ingresar, porque ya existe una sesión abierta.
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #3 (permalink)  
Antiguo 16/10/2010, 10:52
 
Fecha de Ingreso: mayo-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

En eso había pensado, pero... ¿qué pasa si te logueas y de repente se te apaga la compu, o cierras el navegador sin dar click en salir?, se quedaría el estado en 1 en la Base de Datos, y cuando intentes entrar de nuevo te lo impedirá.
  #4 (permalink)  
Antiguo 16/10/2010, 13:05
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 11 meses
Puntos: 89
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Mmmm... .

A ver, se me ocurre lo siguiente :

- Al loguear, verifico si existe alguna sesión activa para el usuario que trata de loguearse ( por sesión, me refiero a $_SESSION ).
- Si la sesión existe y el valor en la base de datos es 1, le impido el acceso.
- Si la sesión NO existe, y el valor en la base de datos es 1, modifico el valor a 0, creo la sesión y le permito el acceso ( en el que caso mencionaste anteriormente ).
- Lógicamente, si el valor es 0 y la sesión no existe, le permito el acceso... obvio .

Pero para efectuar esto, sin problema alguno, tendrías que limitar el tiempo de vida de la sesión. Ya que si ocurre el caso que propusiste y el tiempo de vida de la sesión es extenso, igualmente sería un problema. Aunque hay una configuración, para que al cerrar el navegador, la sesión se elimine, aunque no sé si será igual en caso de que se apague el computador repentimante.

Mira este link, y ve si te da alguna idea : http://www.desarrolloweb.com/articulos/2022.php
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #5 (permalink)  
Antiguo 16/10/2010, 13:21
 
Fecha de Ingreso: mayo-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

¿Y como hago para verificar si existe alguna sesión activa para el usuario que trata de loguearse?
  #6 (permalink)  
Antiguo 16/10/2010, 13:25
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 11 meses
Puntos: 89
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Puedes tener algún código, valor, o cualquier cosa única para cada usuario, por ejemplo su ID, la cual guardarías en una sesión, luego :

Código PHP:
Ver original
  1. // Obtengo los datos del usuario que trata de loguear...
  2. // ... código ...
  3.  
  4. // Verifico si existe la sesión...
  5. if(isset($_SESSION['uid'])) {
  6.      // verifico si es el mismo valor del ID del usuario...
  7.      if(strcmp($_SESSION['uid'], $row['user_id']) == 0) {
  8.            // Son iguales, así que la sesión existe y tiene un valor correcto...
  9.      }
  10. }

Algo así sería...
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #7 (permalink)  
Antiguo 16/10/2010, 13:36
Avatar de Vun
Vun
Colaborador
 
Fecha de Ingreso: agosto-2009
Ubicación: Benalmádena, España
Mensajes: 2.265
Antigüedad: 15 años, 3 meses
Puntos: 150
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Otra idea podría ser que al loguearse guarde la IP y el time() actual en el registro del usuario, y tambien en una variable de sesion guardas el time() actual. Luego en todas tus paginas metes un include que pregunte si han pasado 60 segundos comparando el time() actual con el que tenemos en la variable de sesion. Si es mayor de 60, entonces volvemos a guardar el time() en la base de datos y actualizamos el time() de la variable de sesion. Esto de los 60 segundos es para no saturar la base de datos guardando constantemente el time() en cada pagina!

¿que conseguimos con esto?

Que cuando te logueas, compruebe que si tu IP es distinta a la del registro que vas a loguearte y ademas miramos el time() guardado en la base de datos si han pasado por ejemplo mas de 10 minutos, significa que ese usuario esta inactivo, y podemos dejarle loguear, sino no.
  #8 (permalink)  
Antiguo 16/10/2010, 13:45
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Cita:
Iniciado por spider_boy Ver Mensaje
- Si la sesión NO existe, y el valor en la base de datos es 1, modifico el valor a 0, creo la sesión y le permito el acceso ( en el que caso mencionaste anteriormente ).
No creo que eso funcione =/
Aplicando como tu dices;
Digamos que persona1 entra a la cuenta 'usuario', en la pc de persona1 existe la sesion... Ahora, en la pc de persona2 no existe la sesion, y como persona1 esta loggeado, el valor de la BD es 1... Trata de entrar persona2 y el valor se hace 0 y se le permite el acceso..

Eso esta mal, porque se supone que se le quiere prohibir el acceso a persona2, no a persona1....
Igual puede ser que yo me este equivocando, si es asi, corrijanme que eso se me hace enredoso
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #9 (permalink)  
Antiguo 16/10/2010, 13:48
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 11 meses
Puntos: 89
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Ok, karma negativo para Sourcegeek por contradecirme .

No, broma... bueno, cuando lo pensé, lo pensé pensando ( ) en un usuario entrando desde la misma máquina en distintos tiempos.

Pero bueno, mientras más entren a aportar a este tema, mejor será, y así dejaré de decir locuras .

Saludos .
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #10 (permalink)  
Antiguo 16/10/2010, 13:51
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Jajaja perdon por contradecir xD

Bueno, supongo que Dark se refiere a evitar ingresos simultaneos al
mismo usuario pero de distinta localizacion, no?

Tambien se me ocurre ponerle tiempo a la session, y si ya caduco,
cambias el valor de 1 a 0 de la DB... Pero igual creo que eso no sera
una buena solucion =/
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #11 (permalink)  
Antiguo 16/10/2010, 18:52
 
Fecha de Ingreso: mayo-2009
Mensajes: 31
Antigüedad: 15 años, 5 meses
Puntos: 1
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Cita:
Iniciado por Sourcegeek Ver Mensaje
Tambien se me ocurre ponerle tiempo a la session, y si ya caduco,
cambias el valor de 1 a 0 de la DB... Pero igual creo que eso no sera
una buena solucion =/
Pero si le pones tiempo a la sesión, y el usuario ya ha cerrado el navegador, ¿desde dónde se ejecuta el script que cambia el valor en la BD a 0 de nuevo?
  #12 (permalink)  
Antiguo 16/10/2010, 19:35
Avatar de Sourcegeek
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: $mex['B.C.'];
Mensajes: 1.816
Antigüedad: 15 años, 6 meses
Puntos: 322
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Era solo una sugerencia, por eso creía que
no era una buena solución...
__________________
Buscas desarrollador web? Sourcegeek. Diseño web, Maquetación y Programación
¡Escribe bien! Esto es un foro, no un Facebook para que escribas con los pies
  #13 (permalink)  
Antiguo 20/10/2011, 17:49
 
Fecha de Ingreso: octubre-2011
Mensajes: 2
Antigüedad: 13 años, 1 mes
Puntos: 0
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Hola a todos, bueno sé que el hilo en viejo, pero con la necesidad y por lo leido se me ha ocurrido lo que creo sea una solución al asunto, lo dejo por si le puede servir a alguien que como yo ha necesitado el asunto:

Al lio,

Cuando el usuario1 hace login establecemos una array multidimensional con la variable de session $_SESSION de esta forma:

Código PHP:

   $idunico
=uniqid('user_'); //A esta variable debemos asignarle un valor unico aleatorio cada vez que se haga login.
   
$row['id']=1//Id del usuario obtenido desde la BD

   
$_SESSION['userid'][$row['id']]['conexiones'][$idunico]['IP']=GetUserIp(); //donde obtenemos la IP del usuario actual con la funcion de abajo.
   
$_SESSION['userid'][$row['id']]['conexiones'][$idunico]['ultimo_acceso']=time(); //La seteamos con la hora actual.



   
function GetUserIp()
    {
       
$ip "";
       if(isset(
$_SERVER)) {
        if (!empty(
$_SERVER['HTTP_CLIENT_IP'])) 
          {
             
$ip=$_SERVER['HTTP_CLIENT_IP'];
          } elseif (!empty(
$_SERVER['HTTP_X_FORWARDED_FOR'])) {
             
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
          } else {
             
$ip=$_SERVER['REMOTE_ADDR'];
          }
       } else {
         if ( 
getenv'HTTP_CLIENT_IP' ) ) {
           
$ip getenv'HTTP_CLIENT_IP' );
         } elseif ( 
getenv'HTTP_X_FORWARDED_FOR' ) ) {
           
$ip getenv'HTTP_X_FORWARDED_FOR' );
         } else {
           
$ip getenv'REMOTE_ADDR' );
      }
  } 
   
// En algunos casos muy raros la ip es devuelta repetida dos veces separada por coma 
   
if(strstr($ip,','))
    {
      
$ip array_shift(explode(',',$ip));
    }
   return 
$ip;
  } 
Con esto tenemos la posibilidad de que si hace login por ejemplo el usuario2 con la misma userid no sobreescriba la variable, sino que añada al array su ip y fecha actual.

Gracias a estos datos podremos en cada una de nuestras paginas hacer un checkeo de dicho array y comprobar si existe dentro del mismo $_SESSION['userid']['conexiones'] dos o mas valores [$idunico], si vemos que existe mas de 1 valor comprobamos la IP para ver que no sean iguales, y el time() para descartar aun mas. Por ejemplo podemos dar prioridad al time con mas anterioridad osea al usuario1 que fue el primero en logearse(como por ejemplo para enviarlo al login), yo personalmente lo que voy a hacer es forzar a un nuevo login si existe mas de un usuario logeado con la misma userid, y si el usuario reitera (por si comparte sus credenciales de acceso), baneo su cuenta por X horas

Vale he caido en la cuenta!, para que esto funcione las sesiones deben estar en la BD asi podremos consultar la info de las sesiones que se generen si no, no podras acceder a la informacion de otra sesion que no sea la que esta en curso ;-P

Esta claro que esto mismo se puede hacer directamente con otra tabla en la BD que haga un log y listo, pero serian mas peticiones a realizar, no obstante veo un poco de luz al final del tunel jejeje.

Creo haberme explicado , yo ahora lo estoy poniendo en practica y parece ser que va bien.

Ya os iré leyendo

Saludos a todos

Última edición por zedlp; 20/10/2011 a las 18:31 Razón: Se me ocurrieron mas cosillas para mejorarlo
  #14 (permalink)  
Antiguo 20/10/2011, 20:24
 
Fecha de Ingreso: febrero-2004
Mensajes: 1.987
Antigüedad: 20 años, 9 meses
Puntos: 22
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Realmente el tema de IP nada que ver...

El enfoque es hacia la SESSION y un LOG en BD o en UN FILE de "activos" que contiene los USERS logueados el TIME().

Con ese TIME() se determinan acciones.

Con el USER el ingreso o no ingreso.
  #15 (permalink)  
Antiguo 14/12/2011, 16:45
Avatar de djcandido  
Fecha de Ingreso: junio-2009
Ubicación: San Salvador
Mensajes: 50
Antigüedad: 15 años, 5 meses
Puntos: 0
Respuesta: Evitar 2 ingresos simultaneos con el mismo usuario

Oye!! yo apoyo a zedlp pues, el objetivo es limitar al usuario1 o al usuario2 que inicien sesion en computadoras (y navegadores) diferentes, si estos ya han iniciado una sesion previa y a la vez se encuentra activa.

Etiquetas: sesiones
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 14:45.