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 usuariologout
bandera. -
markForLogout()
: Establece el usuariologout
bandera atrue
. -
unmarkForLogout()
: Establece el usuariologout
bandera afalse
.
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);