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

如何在Laravel中为不同认证守卫创建独立会话避免登出销毁全部会话

Laravel 多守卫独立会话实现方案

1. 创建自定义会话配置中间件

我们需要为两类守卫分别创建中间件,动态修改会话Cookie名称,避免直接修改全局配置产生冲突:

  • 创建普通用户专属会话中间件:
    执行命令:php artisan make:middleware AssignWebSessionCookie
    打开app/Http/Middleware/AssignWebSessionCookie.php修改handle方法:
    public function handle(Request $request, Closure $next)
    {
        config(['session.cookie' => 'laravel_session_web']);
        return $next($request);
    }
    
  • 创建管理员专属会话中间件:
    执行命令:php artisan make:middleware AssignAdminSessionCookie
    打开app/Http/Middleware/AssignAdminSessionCookie.php修改handle方法:
    public function handle(Request $request, Closure $next)
    {
        config(['session.cookie' => 'laravel_session_admin']);
        return $next($request);
    }
    

2. 注册并绑定中间件到路由

打开app/Http/Kernel.php,将两个中间件注册到别名数组:

protected $middlewareAliases = [
    // 原有其他中间件保留
    'session.web' => \App\Http\Middleware\AssignWebSessionCookie::class,
    'session.admin' => \App\Http\Middleware\AssignAdminSessionCookie::class,
];

调整路由分组的中间件顺序,确保自定义会话中间件在web中间件之前加载:

// 普通用户路由组
Route::middleware(['session.web', 'web', 'auth:web'])->group(function () {
    // 普通用户业务路由
});

// 管理员路由组
Route::middleware(['session.admin', 'web', 'auth:admin'])->prefix('admin')->group(function () {
    // 管理员业务路由
});

可选配置:如果两类账号使用不同子域名访问,需要在config/session.php中将domain参数修改为你的根域名,格式为.your-domain.com,保证两个会话Cookie都能正常读写。

3. 调整登出逻辑避免销毁全量会话

默认登出方法会销毁整个会话,我们修改为仅清除对应守卫的认证标识即可:

  • 普通用户登出方法:
    public function userLogout(Request $request)
    {
        auth('web')->logout();
        // 仅清除当前web守卫的登录标识
        $request->session()->forget('login_web_' . sha1(\App\Providers\RouteServiceProvider::class));
        return redirect('/user/login');
    }
    
  • 管理员登出方法:
    public function adminLogout(Request $request)
    {
        auth('admin')->logout();
        // 仅清除当前admin守卫的登录标识
        $request->session()->forget('login_admin_' . sha1(\App\Providers\RouteServiceProvider::class));
        return redirect('/admin/login');
    }
    

如果登录标识键名和示例不符,可以打印session()->all()查看当前会话的键名,对应修改即可。

4. 效果验证

配置完成后分别登录两类账号,在浏览器Cookie列表中可以看到laravel_session_web和laravel_session_admin两个独立的会话Cookie,任意一类账号登出不会影响另一类的登录状态。

内容的提问来源于stack exchange,提问作者Ghiath Al-Khatib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:39:01