目前,没有直接的方法可以做到这一点;由于StatefulGuard 合约及其SessionGuard 实现不像login 那样提供logoutUsingId()。
您需要在您的用户表中添加一个新字段,并在您希望特定用户退出时将其设置为 true。然后使用中间件检查当前用户是否需要强制注销。
这是一个快速实现。
1。添加新字段
让我们在 users 表迁移类中添加一个新字段:
<?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。强制注销中间件
让我们创建一个新的middleware:
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);
}
}
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) 方法。
相关讨论
[Proposal] Log out users by ID
Multiple statements when logged users are deleted