Laravel 9+Breeze实现会话过期后强制用户重输凭证
Laravel 9 + Breeze 实现会话过期后重新验证登录凭证
1. 配置会话生命周期
在config/session.php中设置会话过期参数,按需调整有效期:
'lifetime' => env('SESSION_LIFETIME', 120), // 会话有效期(分钟),可自定义数值 'expire_on_close' => false, // 设为true时,关闭浏览器会话立即过期
2. 确保受保护路由使用身份验证中间件
Breeze生成的已登录路由默认已包含auth中间件,确认你的敏感路由都在该分组内:
// routes/web.php Route::middleware(['auth'])->group(function () { Route::get('/dashboard', function () { return view('dashboard'); })->name('dashboard'); // 其他需要登录权限的路由 });
3. 自定义会话过期后的提示与跳转
修改异常处理器,捕获身份验证异常并添加友好提示:
// app/Exceptions/Handler.php use Illuminate\Auth\AuthenticationException; use Illuminate\Http\Request; public function render($request, Throwable $exception) { if ($exception instanceof AuthenticationException) { if ($request->expectsJson()) { return response()->json(['message' => '会话已过期,请重新登录'], 401); } return redirect()->guest(route('login'))->with('error', '会话已过期,请重新登录'); } return parent::render($request, $exception); }
然后在登录视图中显示错误提示,编辑resources/views/auth/login.blade.php:
@if(session('error')) <div class="alert alert-danger"> {{ session('error') }} </div> @endif
4. 自定义419会话过期页面
用户提交表单时会话过期会触发419状态码,创建自定义页面resources/views/errors/419.blade.php:
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>会话已过期</title> </head> <body> <div class="container"> <h1>会话已过期</h1> <p>您的会话已超时,请重新登录后操作</p> <a href="{{ route('login') }}" class="btn btn-primary">返回登录页</a> </div> </body> </html>
5. 实时检测会话过期(可选)
如果需要实时监控用户活动并在会话过期时立即登出,可自定义中间件:
- 创建中间件:
php artisan make:middleware CheckSessionExpired
- 编写中间件逻辑:
// app/Http/Middleware/CheckSessionExpired.php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class CheckSessionExpired { public function handle(Request $request, Closure $next) { if (Auth::check()) { // 初始化最后活动时间 if (!$request->session()->has('last_activity')) { $request->session()->put('last_activity', now()->timestamp); } $lastActivity = $request->session()->get('last_activity'); $sessionLifetime = config('session.lifetime') * 60; // 检测会话是否过期 if (now()->timestamp - $lastActivity > $sessionLifetime) { Auth::logout(); $request->session()->invalidate(); $request->session()->regenerateToken(); return redirect()->route('login')->with('error', '会话已过期,请重新登录'); } // 更新最后活动时间 $request->session()->put('last_activity', now()->timestamp); } return $next($request); } }
- 注册中间件,在
app/Http/Kernel.php的web中间件组中添加:
protected $middlewareGroups = [ 'web' => [ // 其他已存在的中间件 \App\Http\Middleware\CheckSessionExpired::class, ], ];
内容的提问来源于stack exchange,提问作者hasan idriss
相关产品推荐
相关产品推荐

