Я использую Laravel 5.2.
Я хочу знать, как заставить пользователя выйти из системы по id?
Я создаю панель администратора с возможностью отключения активного пользователя, который в настоящее время зарегистрирован в веб-приложении.
Laravel дает вам эту возможность для текущего пользователя:
Auth::logout()
Но я не хочу выходить из текущего пользователя, поскольку я являюсь пользователем Auth. Мне нужно принудительно выйти из определенного пользователя по его id
. Так же, как при входе в систему пользователя с определенным идентификатором:
Auth::loginUsingId($id);
Есть ли что-то вроде этого:
Auth::logoutUsingId($id);
В настоящее время нет простого способа сделать это; Поскольку контракт StatefulGuard
и его реализация logoutUsingId()
не предлагают logoutUsingId()
как для входа в систему .
Вам нужно добавить новое поле в таблицу users и установить его значение true, когда вы хотите, чтобы какой-либо пользователь был выведен из системы. Затем используйте промежуточное программное обеспечение, чтобы проверить, нужен ли текущий пользователь для выхода из системы.
Вот быстрая реализация.
Давайте добавим новое поле в класс миграции таблицы пользователей:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; 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... }); } // ... }
из<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; 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... }); } // ... }
по<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; 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... }); } // ... }
Убедитесь, что вы php artisan migrate:refresh [--seed]
после изменения миграции.
Давайте создадим новое промежуточное ПО :
php artisan make:middleware LogoutUsers
Вот логика, чтобы проверить, нужно ли выкидывать пользователя:
<?php namespace App\Http\Middleware; use Auth; use Closure; class LogoutUsers { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $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); } }
из<?php namespace App\Http\Middleware; use Auth; use Closure; class LogoutUsers { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $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); } }
Откройте app/Http/Kernel.php
и добавьте FQN промежуточного ПО:
/** * 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', ], ];
Это непроверенный код, но он должен дать вам эту идею. Было бы хорошей практикой добавить несколько методов API в вашу модель User
для сопровождения этой функции:
markedForLogout()
: проверяет флаг logout
пользователя. markForLogout()
: устанавливает флаг logout
пользователя в true
. unmarkForLogout()
: устанавливает флаг logout
пользователя в false
. Затем на стороне администрирования (я полагаю, это ваше дело), вам просто нужно вызвать markForLogout()
в конкретной пользовательской модели, чтобы выгнать его из следующего запроса. Или вы можете использовать построитель запросов для установки флага, если объект модели недоступен:
User::where('id', $userId) ->update(['logout' => true]);
Это может быть markForLogoutById($id)
.
Связанные обсуждения
[Предложение] Выйти из системы пользователями по ID
Несколько операторов при удалении зарегистрированных пользователей