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

Laravel 8使用stancl/tenancy实现租户注册后子域名自动登录问题

Laravel多租户注册后子域名自动登录解决方案

在使用stancl/tenancy实现多数据库多租户时,中央域名注册后跳转子域名无法自动登录的核心原因是跨域Cookie无法共享,默认session仅在当前域名有效。以下是具体解决步骤:

1. 配置跨域共享Cookie

修改config/session.php的domain项为根域名(前缀加.,适配所有子域名):

'domain' => '.example.com',

同时根据环境设置secure属性:生产环境建议设为true(需HTTPS),本地开发可设为false。

2. 重构注册流程,生成一次性登录令牌

不要在中央域名直接调用auth()->login(),改为生成一次性令牌后重定向到子域名的登录接口。修改注册控制器代码:

// 租户创建完成后,获取当前注册用户
$user = auth()->user();

// 生成一次性登录令牌
$token = $user->createToken('tenant-auto-login')->plainTextToken;

// 拼接子域名的自动登录地址
$tenantDomain = $tenant->domains->first()->domain;
$autoLoginUrl = "https://{$tenantDomain}/login-with-token?token={$token}";

// 跳转到子域名的自动登录接口
return redirect()->away($autoLoginUrl);

3. 子域名侧实现令牌验证登录

在租户路由文件(如routes/tenant.php)添加自动登录路由及逻辑:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

Route::get('/login-with-token', function (Request $request) {
    $token = $request->query('token');
    if (!$token) {
        abort(403, '缺少登录令牌');
    }

    // 通过令牌获取用户
    $user = Auth::guard('web')->setToken($token)->user();
    if (!$user) {
        abort(403, '无效的登录令牌');
    }

    // 登录用户并销毁令牌(防止重复使用)
    Auth::login($user);
    $user->tokens()->where('token', hash('sha256', $token))->delete();

    // 跳转到租户后台首页
    return redirect()->route('tenant.dashboard');
});

关键注意事项

  • 确保租户创建时绑定的子域名已正确配置DNS解析
  • 生产环境必须启用HTTPS,否则跨域Cookie可能无法正常工作
  • 令牌验证逻辑需严格校验,避免未授权访问

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:21:00