如何在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
相关产品推荐
相关产品推荐

