Saltar al contenido

Laravel: fuerza el cierre de sesión de un usuario específico por identificación de usuario

Solución:

Actualmente, no hay una forma sencilla de hacer esto; Como el StatefulGuard contrato y su SessionGuard la implementación no ofrece un logoutUsingId() como lo hacen para iniciar sesión.

Debe agregar un nuevo campo a su tabla de usuarios y establecerlo en verdadero cuando desee que se cierre la sesión de un usuario específico. Luego use un middleware para verificar si el usuario actual necesita un cierre de sesión forzado.

Aquí hay una implementación rápida.

1. Agrega un nuevo campo

Agreguemos un nuevo campo a la clase de migración de la tabla de usuarios:

<?php

use IlluminateSupportFacadesSchema;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            // ...
            $table->boolean('logout')->default(false);
            // other fields...
        });
    }

    // ...
}

Asegúrate de correr php artisan migrate:refresh [--seed] después de cambiar la migración.

2. Forzar el cierre de sesión del middleware

Creemos un nuevo middleware:

php artisan make:middleware LogoutUsers

Aquí está la lógica para verificar si un usuario necesita ser expulsado:

<?php

namespace AppHttpMiddleware;

use Auth;
use Closure;

class LogoutUsers
{
    /**
     * Handle an incoming request.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user = Auth::user();

        // You might want to create a method on your model to
        // prevent direct access to the `logout` property. Something
        // like `markedForLogout()` maybe.
        if (! empty($user->logout)) {
            // Not for the next time!
            // Maybe a `unmarkForLogout()` method is appropriate here.
            $user->logout = false;
            $user->save();

            // Log her out
            Auth::logout();

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

        return $next($request);
    }
}

3. Registre el middleware en el kernel HTTP.

Abre el app/Http/Kernel.php y agregue el FQN de su middleware:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        AppHttpMiddlewareEncryptCookies::class,
        IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
        IlluminateSessionMiddlewareStartSession::class,
        IlluminateViewMiddlewareShareErrorsFromSession::class,
        AppHttpMiddlewareVerifyCsrfToken::class,
        IlluminateRoutingMiddlewareSubstituteBindings::class,
        AppHttpMiddlewareLogoutUsers::class, // <= Here
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

Es un código no probado, pero debería darte una idea. Sería una buena práctica agregar un par de métodos API a su User modelo para acompañar con esta funcionalidad:

  • markedForLogout() : Comprueba el usuario logout bandera.
  • markForLogout() : Establece el usuario logout bandera a true.
  • unmarkForLogout() : Establece el usuario logout bandera a false.

Luego, en el lado de la administración (supongo que es tu caso), solo necesitas llamar markForLogout() en el modelo de usuario específico para expulsarlo en la próxima solicitud. O puede utilizar el generador de consultas para establecer la marca, si el objeto del modelo no está disponible:

User::where('id', $userId)
    ->update(['logout' => true]);

Puede ser un markForLogoutById($id) método.

Discusiones relacionadas
[Proposal] Cerrar sesión de usuarios por ID
Varias declaraciones cuando se eliminan los usuarios registrados

Utilice setUser para encontrar una solución

  • obtener usuario actual

       $user = Auth::user();
    
  • cerrar la sesión del usuario que desee, por id

       $userToLogout = User::find(5);
       Auth::setUser($userToLogout);
       Auth::logout();
    
  • establecer de nuevo el usuario actual

       Auth::setUser($user);
    
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *