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

