Laravel多租户下配置Fortify及实现租户会话与数据库连接持久化
解决方案
现有代码Bug修复
先修正两处明显的语法/逻辑错误:
- TenantManager的
getTenant方法语法错误,将return $this-tenant;修改为:
public function getTenant(): ?Tenant { return $this->tenant; }
- IdentifyTenant中间件变量名错误,将租户加载成功后的逻辑修改为:
if ($this->tenantManager->loadTenant($pos !== false ? substr($host, 0, $pos - 1) : $host, $pos !== false)) { $tenant = $this->tenantManager->getTenant(); Session::put('tenant', $tenant); // 加载租户后直接切换数据库连接,后续所有逻辑复用该配置 config(['database.connections.tenant.database' => 'tenant_' . $tenant->id]); DB::purge('tenant'); DB::reconnect('tenant'); // 绑定租户用户模型默认连接为租户库 \App\Models\Tenant\EndUser::setConnection('tenant'); return $next($request); }
1. 配置Laravel Fortify适配租户认证流程
修改config/fortify.php的基础配置,指定Fortify使用租户专属的guard和密码broker:
// 改用租户用户的guard 'guard' => 'end_user', // 改用租户用户的密码重置broker 'passwords' => 'end_users',
修改完成后可以删除CreateNewEndUser中手动切换数据库的冗余代码,简化后的逻辑如下:
public function create(array $input) { Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:tenant.end_users'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '', ])->validate(); return EndUser::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]); }
额外说明:请确保App\Models\Tenant\EndUser模型的$connection属性设置为tenant,或没有硬写固定连接名。
2. 限定会话存储到租户专属sessions表
修改config/session.php配置,指定会话使用租户连接:
'connection' => 'tenant',
如果你的主站也需要使用session存储,可以在IdentifyTenant中间件的租户识别失败分支,动态将会话连接切回主库:
// 租户识别失败时,切回主库存储主站会话 config(['session.connection' => 'mysql']); throw new NotFoundHttpException;
可选优化
如果需要租户侧的邮箱验证、密码重置链接自动绑定对应子域名,可以在对应通知类中动态拼接租户子域名即可,无需修改Fortify核心逻辑。
内容的提问来源于stack exchange,提问作者Adefowowe
相关产品推荐
相关产品推荐

