Laravel 9实现用户非活跃自动登出中间件报错问题排查
问题分析与修复
你的代码存在两个关键问题,导致报错:
- 未处理用户未登录的场景:当用户未登录时,
Auth::user()会返回null,直接访问->is_active会触发"Attempt to read property 'is_active' on null"错误。 Auth::logout()无返回值:logout()方法是void类型,没有返回响应,而中间件的handle方法必须返回一个Illuminate\Http\Response实例,直接return它会抛出类型不匹配的错误。
修正后的中间件代码
use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use Closure; public function handle(Request $request, Closure $next) { // 先判断用户是否已登录 if (Auth::check()) { // 验证用户状态 if (!Auth::user()->is_active) { Auth::logout(); // 清除会话并重新生成CSRF令牌 $request->session()->invalidate(); $request->session()->regenerateToken(); // 返回重定向响应,跳转到登录页并提示用户登出原因 return redirect()->route('login')->with('error', '你的账号已被停用,请联系管理员'); } } return $next($request); }
额外注意事项
- 确保中间件已注册:打开
app/Http/Kernel.php,将你的中间件添加到web中间件组(或指定需要验证的路由组):protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\CheckUserActive::class, ], ]; - 确认用户表中存在
is_active字段,字段类型为布尔值或整数(1表示活跃,0表示非活跃)。
内容的提问来源于stack exchange,提问作者Mifta Khussolikhin
相关产品推荐
相关产品推荐

