Foros del Web » Programando para Internet » PHP »

Control de doble loguin con sesiones en php

Estas en el tema de Control de doble loguin con sesiones en php en el foro de PHP en Foros del Web. Como se puede lograr, creo que con sesiones , que se use el mismo usuario y contraseña al mismo tiempo desde dos maquinas distintas, para ...
  #1 (permalink)  
Antiguo 28/09/2004, 15:32
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
Control de doble loguin con sesiones en php

Como se puede lograr, creo que con sesiones , que se use el mismo usuario y contraseña al mismo tiempo desde dos maquinas distintas, para ingresar en un sitio.
O sea que el usuario registrado , no pueda ingresar de dos maquinas al mismo sitio al mismo tiempo. se entiende ??????

Si alguien tiene un codigo de ejemple , pleaseeee !!!!

Nota: tengo base de datos mysql para corroborar al usuario / contraseña, pero no se como hacer lo que estoy buscando.


Gracias desde yaaaa !!!
  #2 (permalink)  
Antiguo 28/09/2004, 21:24
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Amigo...

Si usas sesiones o cookies... lo que dices es bastante complejo. Las cookies se crean en cada máquina...por lo cual no podrás ver si la cookie del una máquina o de la otra existe o no, y las sesiones se identifican con un SID que es único por cada ventana de navegador, por ende... las sesiones que se creen en cada máquina serán distintas.

No podrás identificar si la sesión o la cookie ya existe... debido a que están en máquinas distintas. Lo más que puedes hacer es crear un campo en tu base de datos donde definas si el usuario está ONLINE o OFFLINE... en base a decides si creas nuevas sesiones o no.

La verdad no estoy muy seguro de si puedes hacerlo o no, estoy un poco tapado hoy y no se me ocurre nada. Un saludo!
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #3 (permalink)  
Antiguo 28/09/2004, 22:11
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
Hola, gracias por tu respuesta, el tema lo pense de varias formas, el grabar un dato en la Base de datos o un flag en un archivo en el servidor, pero se me complica solo cuando el usuario por algun motivo no hace el logout correspondiente, cual seria la forma de borrar o cambiar el estado del usuario en la Base de datos o en el archivo flag
hace vario dias que me tiene con la cabeza a mil espero poder lograrlo seria una de mis desafios mas grandes, mas por su complegidad

Saludos !!! LEO
  #4 (permalink)  
Antiguo 28/09/2004, 22:18
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Precisamente... ¿Cómo cambias el estado si se cierra la ventana?... eso te lo complica todo. No creo posible hacer eso, tendrías que tener acceso completo al servidor.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #5 (permalink)  
Antiguo 28/09/2004, 23:42
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Puedes "jugar" con el SID... lo guardas en la BD y cuando un usuario quiera acceder a una página, verificas que el SID sea el mismo... si es otro... desactivas el primero. Ese identificador puede ser el de la sesión o uno generado por ti guardado en una cookie.

Saludos
  #6 (permalink)  
Antiguo 29/09/2004, 08:05
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Ahh cierto viejo!... claro... por ejemplo:

Si te logueas en la máquina 1, metes el SID en la BD.

Luego cuando te loguees en la 2, comparas el SID... si el SID es = entonces permanece el login activo, de lo contrario, cambias el SID por el último utilizado (el de la 2).

Cuando la máquina 1 trate de seguir navegando, se encontrará con un SID distinto en la BD, por lo tanto tendrías que desloguearlo, y queda logueado solo la máquina 2.

Muy buena idea jpinedo. Aunque... me parece mejor con un archivito txt... donde metas unicamente el SID y lo comparas, asi no haces consultas repetitivas a la base de datos.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #7 (permalink)  
Antiguo 29/09/2004, 08:46
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
Bueno amigos, la verdad que se me abre un toque de esperanza a mi necesidad, jejejeje, la idea esta bastante buena, voy a ir implentando algunas pruebas, si sale prometo que lo dejo a disposición de todo el que lo quiera usar , ya que me imagino que a mas de uno le servira !!!!

Saludos LEO
  #8 (permalink)  
Antiguo 29/09/2004, 08:54
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
Una cosa chicos, de repente no lo entendi bien, cuando entro en la primer maquina me logueo y genero la SID la guardo donde sea, puedo guardar el user;SID (total la password ya la comprobe en la BD) ahora cuando entro en la segunda maquina con el mismo user la SID que genera no es distinta???, entonces como hago la comparación ???, disculpen si hay algo que no entendi.

Saludos
  #9 (permalink)  
Antiguo 29/09/2004, 08:54
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Muy buena idea jpinedo. Aunque... me parece mejor con un archivito txt... donde metas unicamente el SID y lo comparas, asi no haces consultas repetitivas a la base de datos.
mm .. guardar datos en un archivo de texto plano es rápido sí, pero .. hacer consultas a un archivo de texto plano donde debes leerlo secuencialmente .. no es de lo más optimo. Yo usaría igualmente Base de datos para tal fin.

Por lo demás .. .para evitar los problemas de que el usuario "se fué" del sistema no por la "puerta" (por tus "logout"), puedes usar en lugar de "flag's" fechas de ingreso al sistema y actualizar a cada petición (de tu páginas/scripts) ese tiempo para ese usuario, de esta forma podrás dar tiempos de expiración que consideren que el usuario si no hay actividad en X tiempo se considere que se fué ya.

Guardar el SID y compararlo no me parece buena solución para control de la "concurrencia" si hablamos como tal al problema de que una "cuenta": usuario/contraseña sea usada várias veces en X clientes diferentes. Recordemos que el SID es único para el cliente que las crea y el cliente no se refiere a la "cuenta" de tu sistema. De hecho si pruebas en otro PC la misma cuenta, el SID será diferente.

Un saludo,
  #10 (permalink)  
Antiguo 29/09/2004, 08:58
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
Perdon , volvi a releer los mensajes anteriores y ahora si entendi bien la idea.

Entre el primer user y le guardo [USER;SID] en un archivo , y de ahi me fijo en cada pagina que recorre si coinciden el USER;SID si no son iguales detecto que entro otro con el mismo USER pero otro SID entonces anulo el anterior , es asi verdad ????

Gracias por la idea amigossss !!!!
  #11 (permalink)  
Antiguo 29/09/2004, 11:53
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Precisamente Cluster... si después de hacer login se compara el SID y no coincide... pues entonces se borra el anterior y se deja el nuevo.

Yo creo que funciona.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #12 (permalink)  
Antiguo 29/09/2004, 15:05
 
Fecha de Ingreso: septiembre-2004
Mensajes: 6
Antigüedad: 13 años, 2 meses
Puntos: 0
es facil , como este estucturada tu base de usuarios, resolvi el problema con dos columnas TIME_IN y TIME_EXIT , esto significa grbar el tiempo en el cual el usuario se logea en TIME_IN y el tiempo que temina su session en TIME_EXIT vas comprobando cada vez que intenta ingresar cuando ya tiene una session activa que TIME_IN este vacio y sea mayor al tiempo actual y lo rechazas, al final grabas en TIME_EXIT el tiempo en que sale , este tiempo (TIME_EXIT) DEBE SER MENOR AL TIEMPO ACTUAL DE LOGEO DE UNA NUEVA SESSION si esto sucede actualizas los campos e ingresa. ... ... .. ..
Hay mas variantes pero creo que es la mas rapida que SIN molestosos cokies (que es una huevada) , tambien para el caso que el usuario se olvide cerrar su session entoinces te haces un cron que vaya probando si el usuario esta conectado (lees las tablas y vas actualizando por Ej: cada 10 min)
  #13 (permalink)  
Antiguo 30/09/2004, 09:53
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Cita:
Iniciado por Takitei
Precisamente Cluster... si después de hacer login se compara el SID y no coincide... pues entonces se borra el anterior y se deja el nuevo.

Yo creo que funciona.
Insisto .. Recuerda que las sesiones (Ese SID) es único para el cliente que las crea .. nada que ver con tus "usuarios" de tus sistemas. Si yo entro desde PC1 con la cuenta de usuario "pepe:mi_pass" y me voy al PC2 para usar la misma cuenta, .. el "SID" que se generá es uno nuevo .. así que por ese médio no voy a controlar la "concurrencia": que una cuenta se use desde varios PC's (Clientes) .. para eso, puedes usar la solución que plantea himer o la que propongo yo mismo sobre el tiempo de expiración por defecto (que es lo que haría el cron Job de himer)

El caso es que las validaciones se hacen en el script que hace el "login" contra la BD (la tabla de usuarios y esos campos de fecha de ingreso o de última iteracción con el sistema) para que sea tu rutina la que decida si va a poder hacer un nuevo login o será rechazado.

Un saludo,
  #14 (permalink)  
Antiguo 30/09/2004, 12:56
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
No entiendo...

Te logueas en PC1 mediante login.php, en pagina.php verificas si el SID es distinto, si es distinto metes el nuevo que se acaba de crear y borras el anterior.

Luego vienes desde PC2 y haces login en login.php. Luego en pagina.php verificas si el SID es distinto, si es distinto, borras el anterior y metes el nuevo que acabas de crear.

Cuando el usuario que se encuentre en PC1 navegue por pagina.php se comprobará el SID en la BD, debido a que será diferente.... bahhh no sirve.

Olvidenlo... disculpen mi terquedad!...
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #15 (permalink)  
Antiguo 30/09/2004, 13:14
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
El detalle es que el SID siempre será distinto .. por eso no te puedes basar en el SID para el fin de evitar "concurrencia".

Necesitas un dato "en común" que puedas consultar y asociado a esa "cuenta" como podría ser un simple "flag" (1/0) en un campo extra de tu BD para ese registro .. Pero ese simple flag dará problemas cuando el usuario no salga por tu script de "logut.php" donde puedas pasar ese flag al estado "0" para "liberar" esa cuenta. Por eso se usan fechas como "flag" y se actualiza dicha fecha constantemente y compararla en todo "login" que se pretenda hacer a esa "cuenta".

Un saludo,
  #16 (permalink)  
Antiguo 30/09/2004, 13:31
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Es cierto lo que dices... el SID cambia siempre en cada máquina por lo cual no puede haber comparación. Tendrías que hacer que el flag expire de alguna forma.. asi como dice Cluster...
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #17 (permalink)  
Antiguo 30/09/2004, 15:57
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
CHICOSSSSSS !!!! lo resolvi, basado en las ideas aca recibidas, en realidad en vez de usar el SID (hice varias pruebas y solo lo obtenia la primera vez que hacia sesseion_start() ) , lo hice guardando el dato en una tabla con el user / y un numero randomico entre 10 y 1000, y en todas las paginas pongo
sesseion_start()
valido= ensesion(conexion,tabla,$_SESSION['usuario'],$_SESSION['numero']
si valido es uno , funcion que comprueba en la BD si es correcto
y tengo por otro lado cuando hace el loguin la persona primero lo borro de la tabla y luego lo vuelvo a grabar con la diferencia del Nº randomico, de esta forma el que entro por ultimo siempre esta activo dejando fuera al que entro anteriormente.
Mil gracias a todos , hace varios dias que venia con este KARMA , gracias a todos UDS. lo he podido resolver. MIL GRACIAS de nuevooo !!!! se las debo !!!

SALUDOS LEO
  #18 (permalink)  
Antiguo 30/09/2004, 15:59
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
De repente , con la emocion no deje bien claro la solucion, pero si a alguien le interesa la explico detalladamente, bye !!!
  #19 (permalink)  
Antiguo 30/09/2004, 16:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
mm Bueno estaría bien que con calma explicases (y con algo de código y estructura de tus tablas ayudaría) como lo resolvistes ..

Por qué no entendí como controlas la denegación de acceso a esa cuenta (por qué ya está en el sistema) y como haces para "liberar" esa cuenta para que pueda ingresar en otro momento ese usuario con esa misma cuenta.

Un saludo,
  #20 (permalink)  
Antiguo 01/10/2004, 22:29
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
El tema , es el siguiente, entra un usuario con pepe/paspepe , al rato entra otra persona con la misma combinacion pepe/paspepe, quien entro por ultimo seguira bajando archivos y navegando por la zona restringida a los usuarios, y el anterior se joroba ya que el segundo lo dejo fuera.
Que logro con esto, que si tu pagas y le das tu pas y user a un amigo , al final terminas perjudicado tu , porque tu amigo si entra despues que vos , te estara dejando fuera del servicio
el codigo lo paso por mail o no se si hay algun lugar donde dejar todo el codigo en el foro. Caulquier cosa avisan
  #21 (permalink)  
Antiguo 01/10/2004, 22:57
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Pegalo aca si no es muy largo. Asi lo vemos todos. No se... digo yo.
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
  #22 (permalink)  
Antiguo 02/10/2004, 05:51
 
Fecha de Ingreso: junio-2004
Mensajes: 51
Antigüedad: 13 años, 5 meses
Puntos: 0
ok ahi va
************************ todas las paginas al inicio tienen esto *****
Código PHP:
session_start();
$valido en_sesion($conexion,$nombretabla,$_SESSION['usuario'],$_SESSION['numid']); 
mas abajo en el codigo de cada pagina uso la variable $valido para mostrar cosas de usuario solo si esta en el valor que se le indica como valido (1)

************************************************** *************

la funcion esta en otro archivo que lo hago con un include es esta
Código PHP:
function en_sesion($conexion$tabla$s_user$s_numero)
    {
        
$esta 0;
                          
variable de consulta SQL con esta sintaxis
"Select * from sesiones where id_usuario = '".$s_user."' and id_sesion = '".$s_numero."'"
sacar numero de registros $numero_de_registros

        
if($numero_de_registros <> 1)
        {
            
$esta 0;
        }
        else 
        {
            
$esta 1;
        }
        return 
$esta;
    } 
esto es cuando hace el loguin : en el index
en el form del loguin action=control_in.php (pasando las variables por post o como les guste)

poner en un archivo distintio que se llame contro_in.php (por ejempl)
Código PHP:
if (isset($_POST['user']) && isset($_POST['pass']))
{
// Saco los datos del usuario que se logueo de la tabla de sesiones
// Si estaba logueado y entro otro con su user pass el anterior queda fuera
//***************************************************************consulta sql para sacar los registros de ese user "Delete from sesiones Where id_usuario = '".$user."'");            
session_start();                
$_SESSION['usuario'] = $user;
$_SESSION['numid']    = rand(10,1000); //(La diferencia entre el anterior logueado con es mismo ID es que quedara fuera el primero que entro y adentro el ultimo. 
guardo los nuevos datos en la tabla sesiones

y me voy al index de nuevo
Código PHP:
header("Location: index.php"); // vulevo a la pagina principal desde donde se logueo
exit();        
}
else 
{
header("Location: index.php?cod="poner un codigo como para decir que no figura");
exit();
}

y aca va la tabla

Código PHP:
nombresesiones
id_usuario   varchar
(lo que quieran)
id_sesion    int(6
Bueno espero que sirva si hay comentarios seran bien venidos !!!

Saludos Amigossss !!!!

Última edición por Cluster; 04/10/2004 a las 07:32
  #23 (permalink)  
Antiguo 02/10/2004, 07:47
Avatar de Takitei  
Fecha de Ingreso: septiembre-2004
Ubicación: Venezuela
Mensajes: 1.231
Antigüedad: 13 años, 2 meses
Puntos: 5
Amigo, por favor edita tu mensaje y coloca el código dentro de tags .
__________________
Takitei
Ingeniarte.com
DannyHerran.com
"Dadme un punto de apoyo y moveré la tierra" - Arquímedes.
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 18:38.