Laravel: fuerza la desconexión del usuario específico por ID de usuario

Yo uso Laravel 5.2.

Quiero saber cómo puedo forzar a un usuario a desconectarse por ID.

Estoy construyendo un panel de administración con la opción de desactivar el usuario específico que está actualmente conectado a la aplicación web.

Laravel te da esta opción para el usuario actual:

Auth::logout() 

Pero no quiero cerrar la sesión del usuario actual, ya que soy ese usuario de Auth. Necesito obligar a cerrar la sesión de un usuario específico por su id . Al igual que cuando iniciamos sesión en un usuario con una identificación específica:

 Auth::loginUsingId($id); 

¿Hay algo como esto?

 Auth::logoutUsingId($id); 

Actualmente, no hay una manera directa de hacer esto; Como el contrato de SessionGuard y su implementación de SessionGuard no ofrecen un logoutUsingId() como lo hacen para el inicio de sesión .

Debe agregar un nuevo campo a su tabla de usuarios y establecerlo en verdadero cuando desee que un usuario específico sea desconectado. 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. Agregue un nuevo campo

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

 boolean('logout')->default(false); // other fields... }); } // ... } 

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

2. Forzar middleware de cierre de sesión

Vamos a crear un nuevo middleware :

 php artisan make:middleware LogoutUsers 

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

 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. Registrar el middleware en el núcleo HTTP

Abra la app/Http/Kernel.php y agregue su FQN de middleware:

 /** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, \App\Http\Middleware\LogoutUsers::class, // <= Here ], 'api' => [ 'throttle:60,1', 'bindings', ], ]; 

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

  • markedForLogout() : comprueba el indicador de logout de logout del usuario.
  • markForLogout() : establece el indicador de logout de logout del usuario en true .
  • unmarkForLogout() : establece el indicador de logout de logout del usuario en false .

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

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

Puede ser un markForLogoutById($id) .

Discusiones relacionadas
[Propuesta] Cerrar sesión usuarios por ID
Varias declaraciones cuando se borran usuarios registrados