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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 05:45:28