Laravel Sanctum多子域名独立登录登出问题求助
Laravel Sanctum多子域名会话隔离问题解决方案
当前问题
- 在
client.domain.local登录成功后,client2.domain.local会自动同步登录状态(使用client.domain.local的账号凭证) - 在
client2.domain.local执行登出操作后,client.domain.local的登录状态也会同步失效
当前配置
.env 文件
SANCTUM_STATEFUL_DOMAINS=client.domain.local,client2.domain.local SESSION_DOMAIN=.domain.local
sanctum.php 核心配置
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '', env('FRONTEND_URL') ? ','.parse_url(env('FRONTEND_URL'), PHP_URL_HOST) : '' ))),
auth.php 守卫与提供者配置
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], 'client' => [ 'driver' => 'session', 'provider' => 'clients', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], 'clients' => [ 'driver' => 'eloquent', 'model' => App\Models\ClientUser::class, ], ],
解决方案
问题本质是SESSION_DOMAIN=.domain.local的配置让所有子域名共享同一会话Cookie,导致登录状态互通。要实现两个子域名的会话隔离,需要让每个子域名使用独立的会话Cookie,具体操作如下:
1. 移除固定会话域名配置
打开.env文件,删除或注释掉SESSION_DOMAIN的固定配置:
# SESSION_DOMAIN=.domain.local
2. 动态设置会话域名
在app/Providers/AppServiceProvider.php的boot方法中添加动态设置逻辑,让会话域名绑定到当前请求的子域名:
use Illuminate\Support\Facades\Config; use Illuminate\Http\Request; public function boot() { $request = Request::capture(); $currentHost = $request->getHost(); $allowedDomains = explode(',', env('SANCTUM_STATEFUL_DOMAINS', '')); // 仅在目标子域名请求时,设置对应会话域名 if (in_array($currentHost, $allowedDomains)) { Config::set('session.domain', $currentHost); } }
3. 清理缓存并验证
- 执行命令清除配置和应用缓存:
php artisan config:clear php artisan cache:clear
- 测试登录:在
client.domain.local登录后,打开client2.domain.local,此时不会自动登录 - 测试登出:在
client2.domain.local登出后,client.domain.local仍保持登录状态
关键说明
SANCTUM_STATEFUL_DOMAINS保持原有配置即可,确保两个子域名都能通过Sanctum的状态验证- 动态设置会话域名后,每个子域名的会话Cookie会绑定到自身域名,不会跨子域名共享,彻底实现会话隔离
内容的提问来源于stack exchange,提问作者SoulXin
相关产品推荐
相关产品推荐

