2010-07-25 13 views
10

Estoy desarrollando la parte de administración de usuarios de un sitio web que albergará un webcast. El objetivo es impedir que se use al mismo usuario nam (dirección de correo electrónico) de forma concurrente. Es decir, no queremos que dos personas usen un inicio de sesión para ver el evento.Cómo evitar el inicio de sesión simultáneo de usuarios en el sitio PHP/MySQL?

Ya he configurado una tabla que contiene los datos de registro del usuario con regID como clave principal. Mi idea es crear una tabla de historial de inicio de sesión con nombre de usuario como clave principal, clave externa para nombre de usuario en la tabla de registro. La tabla de historial de inicio de sesión simplemente marca la fecha cuando el usuario inicia sesión en el sitio. Sin embargo, esto no cumplirá mi objetivo de evitar que más de un individuo use el mismo nombre de inicio de sesión.

En su lugar, ¿sería mejor tener un campo de estado de inicio de sesión en el historial de inicio de sesión o en la tabla de usuario que está configurada en 1 para iniciar sesión y 0 para cerrar la sesión? Necesitaría un procedimiento almacenado para actualizar el valor al iniciar sesión y al cerrar la sesión, y debería validarse cuando un usuario inicie sesión de modo que si el estado de inicio de sesión = 1, el usuario ya inició sesión y no puede iniciar sesión por segunda vez. ¿Es este un enfoque factible?

Comparta otros métodos que haya utilizado para evitar que se comparta la misma credencial de inicio de sesión entre varias personas.

Gracias, Sid

Respuesta

7

Si está bien cerrar la sesión de un usuario que ya inició sesión si alguien más inicia sesión con las mismas credenciales, puede hacer lo siguiente: cuando un usuario inicia la sesión genera un ID aleatorio en su base de datos para ese usuario y el mismo una sesión de cookie . Los dos deben coincidir para autenticarse.

+1

Reemplazar "cookie" con "sesión", y esto funcionará bien. Solo asegúrese de verificar el valor de la sesión con la base de datos en cada solicitud, y siempre restablecer el valor cuando el usuario inicie sesión de nuevo. Dos usuarios que intentan ver la página se registrarán continuamente. – Charles

+0

Sí, buena llamada, publicación actualizada para leer "sesión". – MrWhite

+0

Me gusta su enfoque. La única advertencia sería que el segundo usuario, cuando intenta utilizar un inicio de sesión que ya está en uso, recibe un mensaje que indica que la identificación del usuario ya está iniciada, o algo por el estilo. Queremos asegurarnos de que todos los que estén viendo el webcast tengan sus propias credenciales de inicio de sesión. Gracias :) – SidC

0

El problema aquí está detectando el usuario se registra en (es decir, si él no cerrar la sesión).

Una forma posible es registrar en la base de datos la hora de su última actividad y el momento de su cierre de sesión explícito. A continuación, podría denegar el inicio de sesión si esto se intentó hace menos de 5 minutos con respecto a su actividad más reciente y si no inició sesión en el medio.

Podría forzar la "actividad" haciendo que las páginas web periódicamente sondeen el servidor con Javascript.

+0

¿Sería factible crear una función que verifique la tabla loginhistory para ver si el usuario tiene una transacción de inicio de sesión en los últimos 5 minutos sin una transacción de cierre de sesión correspondiente? Gracias :) – SidC

+0

@SidC Podría pero alguien más podría iniciar sesión después de esos 5 minutos. – Artefacto

0

Es fácil determinar cuándo alguien inicia sesión. Es mucho más difícil determinar cuándo alguien cierra la sesión. Si tiene un mecanismo para matar rápidamente la transmisión web a un usuario en particular, es posible que desee tener algo que aparezca preguntando al usuario si desea matar a su otra sesión si cree que podría haber una activa.

-3

Es posible que desee considerar hacer una variable global en php para almacenar una matriz de hash con estado de inicio de sesión. Esto tiene la ventaja de que si la aplicación debe reiniciarse por algún motivo, el usuario no se quedará atrapado en un estado incorrecto en la base de datos.

Puede almacenar una asignación de ID de usuario a IP o cookie de sesión y redirigir las solicitudes que vienen con información diferente a la página de inicio de sesión. Si el usuario inicia sesión, la otra sesión se invalidará y otras solicitudes en la última sesión se enviarán a la página de inicio de sesión.

0

¿Cómo está haciendo las sesiones de usuario en el servidor? Si los almacena en el archivo db, puede consultar las sesiones activas cada vez que alguien intente iniciar sesión y ver si ya están allí. Por supuesto, es probable que también deba verificar algún tipo de marca de tiempo, ya que no está garantizado que las sesiones desaparecerán en session.gc_maxlifetime.

2

Sin rodar su propio controlador de sesión, podría hacer un pequeño seguimiento paralelo. Cuando un usuario inicia sesión, puede almacenar el ID de sesión y el tiempo de inicio de sesión del usuario en la base de datos (tal vez dentro de la tabla de información del usuario). El script de inicio de sesión podría verificar la existencia de este ID de sesión y permitir/denegar el inicio de sesión en función de la presencia del ID de sesión. Si la ID es nula/en blanco, el usuario inicia sesión. Si hay una ID de sesión presente y tiene más de X minutos de antigüedad, permita el inicio de sesión. De lo contrario, niegalos.

Por supuesto, es probable que desee ejecutar su propio controlador de limpieza de sesión en ese punto, de modo que cuando los archivos de sesión obsoletos se eliminen, puede eliminar los ID asociados de la base de datos al mismo tiempo.

Cuestiones relacionadas