Laravel 8如何实现管理员禁用已登录用户后自动强制其登出
Laravel 已登录用户被禁用后强制下线实现方案
你当前在LoginController中添加的状态校验仅在用户提交登录请求时生效,已持有有效会话的用户后续请求不会触发登录校验逻辑,无法自动感知账号被禁用的状态,最稳妥的实现方式是通过全局请求中间件做前置校验,步骤如下:
第一步:生成自定义校验中间件
执行artisan命令创建中间件文件:php artisan make:middleware CheckUserState打开生成的
app/Http/Middleware/CheckUserState.php文件,替换为如下逻辑:<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class CheckUserState { public function handle(Request $request, Closure $next) { // 已登录用户状态为0时,强制退出 if (Auth::check() && Auth::user()->state === 0) { Auth::logout(); // 作废当前会话、重新生成CSRF令牌避免会话固定风险 $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect('/login')->with('error', '账号已被管理员禁用,请联系管理员'); } return $next($request); } }第二步:注册中间件到Web请求组
打开app/Http/Kernel.php文件,将刚写好的中间件加入web中间件组,注意必须放在StartSession中间件之后,否则无法正常获取会话登录信息:protected $middlewareGroups = [ 'web' => [ // 框架自带的其他前置中间件 \Illuminate\Session\Middleware\StartSession::class, // 框架自带的其他中间件,比如视图共享、错误提示等 \App\Http\Middleware\CheckUserState::class, // 新增这一行 ], ];
注意:不要把该中间件加到
$middleware全局中间件数组中,否则未登录用户访问登录页等公开路由时会出现逻辑异常。
如果项目用户量较大,担心每次请求查询用户表带来性能损耗,可以额外做优化:管理员禁用用户时,在缓存中存入被禁用用户的ID列表,中间件优先从缓存判断用户状态,不用每次查库,中小体量项目直接用上面的方案完全可以满足需求。
内容的提问来源于stack exchange,提问作者Alejandro
相关产品推荐
相关产品推荐

