Intereting Posts
Почему PHPUnit скрывает обратную линию xdebug? Являются ли подготовленные PDO заявления достаточными для предотвращения SQL-инъекций? Youtube Data API v3: как комментарий другого пользователя Экспертные мнения по очень большому количеству столбцов в таблице mySQL? Прокси для посещения и пребывания на «CURLOPT_URL» 60 с / 120 или более раз Javascript изменяет внутренний html div, который содержит conatins php Как выполнить команду в контроллере приложения Symfony2 и распечатать в режиме реального времени вывод в шаблоне Twig Lex и Yacc в PHP Как отправить массив объектов в формате JSON из PHP Диапазон дат перекрытия MySQL поделиться одним и тем же файлом cookie между двумя веб-сайтами с помощью расширения PHP cURL Laravel 5 Проверка правильности Какие другие языки позволяют программистам использовать интерфейсы в качестве функциональных параметров? Поиск в Active Directory через PHP Сбросить позицию курсора в PDO

Laravel – принудительный выход определенного пользователя по идентификатору пользователя

Я использую Laravel 5.2.

Я хочу знать, как заставить пользователя выйти из системы по id?

Я создаю панель администратора с возможностью отключения активного пользователя, который в настоящее время зарегистрирован в веб-приложении.

Laravel дает вам эту возможность для текущего пользователя:

Auth::logout() 

Но я не хочу выходить из текущего пользователя, поскольку я являюсь пользователем Auth. Мне нужно принудительно выйти из определенного пользователя по его id . Так же, как при входе в систему пользователя с определенным идентификатором:

 Auth::loginUsingId($id); 

Есть ли что-то вроде этого:

 Auth::logoutUsingId($id); 

В настоящее время нет простого способа сделать это; Поскольку контракт StatefulGuard и его реализация logoutUsingId() не предлагают logoutUsingId() как для входа в систему .

Вам нужно добавить новое поле в таблицу users и установить его значение true, когда вы хотите, чтобы какой-либо пользователь был выведен из системы. Затем используйте промежуточное программное обеспечение, чтобы проверить, нужен ли текущий пользователь для выхода из системы.

Вот быстрая реализация.

1. Добавить новое поле

Давайте добавим новое поле в класс миграции таблицы пользователей:

 <?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] после изменения миграции.

2. Выполнить промежуточное ПО для выхода из системы

Давайте создадим новое промежуточное ПО :

 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); } } 

3. Зарегистрируйте промежуточное ПО в ядре HTTP

Откройте 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
Несколько операторов при удалении зарегистрированных пользователей