En lugar de almacenar si el usuario está activo \ inactivo, es mejor almacenar algún atributo que pueda verificarse contra el usuario por acción; como en, cada vez que el usuario intenta hacer algo que requiere autenticación, verificará que este atributo coincida antes de continuar.
Le recomiendo que haga lo siguiente;
Primero, cree un hash para identificar al usuario de manera única cada vez que inicie sesión. Imagino que un sha1
de time()
sería suficiente para evitar colisiones.Elija lo que elija, asegúrese de que sea lo suficientemente variado para que otro usuario que inicie sesión tenga una probabilidad increíblemente baja de recibir el mismo hash (por ejemplo, no cifre la dirección IP o el user-agent del navegador, ya que estos no son variados). suficiente).
En segundo lugar, almacenar este hash en su base de datos y en el usuario de session en el momento de iniciar sesión. Si lo hace, efectivamente 'desconectarse' el usuario anterior, ya que el hash debe ser diferente cada vez que alguien abre una sesión.
Dado que estamos utilizando sesiones, una cookie debe colocarse automáticamente en el navegador del usuario que contendrá una identificación única que identifica al usuario con sus datos de sesión. El contenido de la cookie no es realmente preocupante.
A continuación, cree una función llamada authenticateUser()
o similar, que se invocará al inicio de cada secuencia de comandos para garantizar que el usuario esté autenticado. Este script debe consultar la base de datos, verificando si un usuario con su ID de usuario tiene un hash que coincida con el hash de su usuario.
Por ejemplo:
function authenticateUser($id, $hash, $databaseLink) {
# SQL
$sql = 'SELECT EXISTS(
SELECT 1
FROM `tbl_users`
WHERE `id` = \''.mysql_real_escape_string($id).'\'
AND `hash` = \''.mysql_real_escape_string($hash).'\'
LIMIT 1
);';
# Run Query
if ($query = mysql_query($sql, $databaseLink)) {
# Get the first row of the results
# Assuming 'id' is your primary key, there
# should only ever be one row anyway.
$result = mysql_fetch_row($query);
# Casting to boolean isn't strictly necessary here
# its included to indicate the mysql result should
# only ever been 1 or 0.
return (bool)($result[0]);
} else {
# Query error :(
return false;
}
}
Luego, simplemente pasan authenticateUser()
del usuario ID
, hash
(por sus datos de sesión) y una database link
(para una conexión de base de datos, tendrá que haber abierto antes).
Si authenticateUser()
devuelve true
, el usuario está autenticado. Si false
, el usuario no está O la base de datos no está disponible o hay un error de SQL.
Sin embargo, tenga en cuenta que esto aumentará la carga de su servidor ya que una solicitud de base de datos se envía una vez por solicitud de página. Probablemente no sea tan acertado hacer esto en proyectos gigantescos en los que miles de personas inician sesión en un momento dado. Estoy seguro de que alguien puede sugerir mejoras.
Además, esperar a que caduque la cookie no es la mejor manera de obligar a las personas que han estado inactivas a desconectarse, ya que nunca debe confiar en las cookies. En su lugar, puede agregar una columna llamada last_active
que puede actualizar cada vez que el usuario se autentica. Esto también aumentará la carga del servidor, pero le permitirá anular manualmente el inicio de sesión obsoleto al eliminar el hash
para usuarios que estuvieron, por ejemplo, inactivos durante 3 horas.
El bit de pregunta real de esto ("¿cómo puedo desconectar a los usuarios que se vuelven inactivos?"), Se ha preguntado aquí anteriormente (ver http://stackoverflow.com/questions/247412/) –