如何将Filament+stancl/laravel登录页置于中心域名并支持租户选择?
解决Filament多租户登录页部署及跳转问题
1. 调整中间件与路由分组,隔离中心域名与租户域名
- 避免
InitializeTenancyByDomain中间件作用于中心域名的登录路由,在app/Http/Kernel.php或routes/web.php中拆分路由组:// 中心域名路由组(无租户中间件) Route::domain(config('app.central_domain'))->group(function () { Filament::loginRoute(); Filament::logoutRoute(); }); // 租户子域名路由组(应用租户中间件) Route::domain('{tenant}.' . config('app.central_domain')) ->middleware([ 'web', InitializeTenancyByDomain::class, 'tenancy:central', ]) ->group(function () { Filament::routes(); }); - 修改
config/filament.php,取消硬编码域名配置,交由路由组控制:'domain' => null, 'path' => '/admin',
2. 自定义登录控制器,处理认证后租户跳转
- 扩展Filament默认登录控制器,在认证成功后根据用户选择的租户生成子域名跳转链接:
namespace App\Http\Controllers\Auth; use Filament\Http\Controllers\Auth\LoginController as BaseLoginController; use Illuminate\Http\Request; class LoginController extends BaseLoginController { protected function authenticated(Request $request, $user) { // 获取登录表单提交的租户ID,需确保表单已添加tenant_id字段 $tenant = $user->tenants()->findOrFail($request->tenant_id); // 构建租户子域名后台地址 $tenantAdminUrl = "https://{$tenant->domain}.{config('app.central_domain')}" . config('filament.path'); return redirect()->to($tenantAdminUrl); } } - 在
config/filament.php中指定自定义登录控制器:'auth' => [ 'controller' => App\Http\Controllers\Auth\LoginController::class, ],
3. 禁用Filament自动路由,避免路由冲突
- 在
config/filament.php中关闭自动路由生成,确保手动注册的路由生效:'routes' => false,
4. 验证租户会话关联逻辑
- 若跳转后租户上下文未正确初始化,可在登录后的跳转前临时初始化租户:
// 在authenticated方法内添加 tenancy()->initialize($tenant);
内容的提问来源于stack exchange,提问作者Eduardo Carvalho
相关产品推荐
相关产品推荐

