Redirigir automáticamente cuando la sesión del usuario expira en Larav

Redirigir automáticamente cuando la sesión del usuario expira en Laravel 5.5

Quiero redirigir automáticamente a mi página de inicio de sesión cuando la sesión de un usuario expire usando las funciones de Laravel. Redirijo cuando un usuario intenta acceder a otra página y la sesión caduca. He configurado una vida útil que ayuda a cerrar sesión automáticamente debido a la inactividad del usuario, y lo que quiero es redirigir instantáneamente cuando se agote el tiempo de espera de esa sesión.

Intenté usar JavaScript para el tiempo de espera, pero esto no funciona cuando el usuario está usando más de una página a la vez.

También intenté usar AJAX, enviando solicitudes para verificar el estado de la sesión cada minuto, esto funciona, pero cuando el proyecto está en producción, hay muchas solicitudes al servidor solo para verificar el estado de la sesión. (Este es el enlace que me ayudó para esto https://laracasts.com/discuss/channels/laravel/help-is-needed-on-idle-session-time-out)

Ahora, estoy intentando usar App/Exceptions/Handler.php, con la función unauthenticated():

protected function unauthenticated($request, AuthenticationException $exception)
{
  if ($request->expectsJson()) {
        return response()->json(['error' => 'Unauthenticated.'], 401);
    }

    return redirect()->guest(route('login'));
}

(Redirigir al usuario a la página de inicio de sesión cuando caduca la sesión - Laravel )

Esta última solución no funciona, no aparece ningún error pero no hace absolutamente nada.

Si es posible, por favor dígame la forma correcta de hacerlo.

Mostrar la mejor respuesta

Como ya notó, debe preguntarle al servidor si la sesión aún está activa en caso de que desee permitir más de una pestaña. No hay otra solución que se ajuste a sus necesidades.

Construí algo similar, pero usa el diálogo jQuery UI para abrir una ventana emergente con un modal (bloqueador de UI) y luego Ajax para iniciar sesión. De esta manera, los usuarios no pierden ningún trabajo que tengan en la página como lo haría una redirección. Pero debe tener cuidado con la forma en que verifica la sesión, porque el acto de verificar la sesión puede mantenerla viva. Ya usamos un controlador de sesión personalizado que usa la base de datos para los datos de la sesión, por lo que fue fácil verificarlo para mí. También sondea el sitio cada 15 segundos para ver si el usuario está vencido. Mantenemos las sesiones activas durante solo 30 minutos sin actividad. no fue trivial

Avatar sam
Respuesta aceptada

Como sus sesiones tienen una vida útil fija, puede pasar esa información al cliente y otorgarle la responsabilidad de consultar el servicio para determinar la caducidad de la sesión en el momento en que espera que la sesión haya caducado para que, en lugar de consultar constantemente su servicio para el estado de sus sesiones, solo consultan cuando es probable que haya expirado.

  1. Un usuario realiza una solicitud a su sitio web
  2. Middleware genera una marca de tiempo que representa el punto en el que expirará su sesión y se la devuelve al cliente para que la almacene como una cookie
  3. Javascript se ejecuta en el cliente que recupera la marca de tiempo de la caducidad de su sesión de la cookie y luego, cuando se alcanza esa marca de tiempo, verifica si el valor de la cookie ha cambiado y, de lo contrario, se realiza una solicitud al extremo del estado de su sesión para confirmar. su sesión ya no está activa
  4. El extremo del estado de su sesión devuelve un estado caducado (que activa el comportamiento de la sesión inactiva) o devuelve una nueva marca de tiempo con la que puede actualizar la cookie para que el proceso se repita de nuevo cuando caduque. se alcanza

Personalmente, no recomendaría redirigir automáticamente a alguien al formulario de inicio de sesión cuando su sesión haya expirado porque significa que cuando tienen muchas páginas abiertas, cada página ahora será el formulario de inicio de sesión que es un mal usuario. experiencia. Muchos usuarios técnicos entenderán que pueden iniciar sesión en una página y luego actualizar las demás, sin embargo, muchas personas no técnicas no lo harán y creerán que deben ingresar su nombre de usuario y contraseña en cada página.

Si su aplicación depende de una sesión activa incluso después de cargar la página, es decir, es una aplicación de una sola página que usa ajax, entonces, cuando la sesión expire, debe deshabilitar la página con un modal que dice "Su sesión ha expirado, por favor inicie sesión nuevamente para continuar usando esta página" y cuando hagan clic en iniciar sesión, primero verifique si tienen una sesión activa y, en caso contrario, redirija al formulario de inicio de sesión. Esto significa que si tienen muchas pestañas abiertas y su sesión caduca, cuando regresan a esas pestañas y hacen clic en el botón "iniciar sesión", el uso de su página se reanuda de inmediato. Esta es una experiencia de usuario mucho mejor.

Puedes usar Auth::check()

if(Auth::check()) { 
    //Do anything you want
}
return redirect('/login');