Estoy creando un sistema donde el objetivo es que solo una persona por usuario pueda acceder al sistema, para esto tengo en mi base de datos dos tablas llamadas: usuarios y accesos Lo que estoy haciendo es que cuando la persona 1 inicie sesión, se guarde en mi DB la identificación de la sesión en las dos tablas, si la persona 2 con el mismo usuario intenta acceder, la primera persona que inicia sesión lo saca del sistema. Hago esto con la ayuda de AJAX, comparando si el último usuario que inició tiene la misma identificación de sesión, entonces puede navegar sin problema, si no cierra la sesión.
El problema es que hago esta solicitud ajax cada 10 segundos, pero tendría problemas si 10,000 personas o más inician sesión, entonces la solicitud se enviará al servidor cada 10 segundos y esto podría saturar el servidor.
Pruebe con un campo activo si la sesión es igual a 1 y si la sesión es igual a 0, entonces descarte esto ya que si el usuario cierra el navegador, nunca cierro la sesión y la persona no podrá acceder, también probé usando un método ajax para detectar si cierras el navegador pero no es muy fiable. ¿Alguien ha tenido el mismo problema? te lo agradeceria mucho
Dejo mi código php y js para mostrar como lo hago:
Código JS:
$(function() { cron(); // Lanzo cron la primera vez function cron() { $.ajax({ method: "POST", url: "closeuser.php", data: { action: 1 } }) .done(function(msg) { var trimmedString = msg.trim(); console.log(trimmedString) if( trimmedString == 'success' ) { // Valida si el server devolvió 'success' location.href='logoutuser.php'; } }); } setInterval(function() { cron(); }, 10000); // cada 10 segundos });Codigo PHP:
<?php require_once 'Connections/sesionunica.php'; $connection_s = new sesionunica(); if(!isset($_SESSION["id_user"])){ echo"<script>location.href='index.php';</script>"; } if(isset($_POST["action"])) { // Se pasa una acción switch(sprintf("%d", $_POST["action"])) { // ¿Qué acción? case 1: cerrar(); break; default: echo "default"; } } function cerrar(){ $ses = session_id(); $connection_s = new sesionunica(); $userById = $connection_s->getUsers($_SESSION["id_user"]); if ($userById["id_sesion"] <> $ses) { echo "success"; } } ?>De igual manera no puedo usar websockets ya que hay problemas de accesibilidad con el servidor.
Creo que podría crear un "filtro de acceso" que verificaría si el "token de acceso" es válido o no en cada solicitud que harían los usuarios.
Si el "token de acceso" está vencido, devuelva un estado HTTP 401 (no autorizado) y, en el lado del cliente, redirija al usuario a la página de inicio de sesión.
El filtro de solicitud es un recurso muy común que tienen muchos marcos REST.