You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 实时检测会话过期(可选)

如果需要实时监控用户活动并在会话过期时立即登出,可自定义中间件:

  1. 创建中间件:
php artisan make:middleware CheckSessionExpired
  1. 编写中间件逻辑:
// 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);
    }
}
  1. 注册中间件,在app/Http/Kernel.php的web中间件组中添加:
protected $middlewareGroups = [
    'web' => [
        // 其他已存在的中间件
        \App\Http\Middleware\CheckSessionExpired::class,
    ],
];

内容的提问来源于stack exchange,提问作者hasan idriss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:06:23