Laravel8多租户应用跨子域用户认证可行性及实现方案咨询
多租户应用需求实现方案
一、跨关联子域登录状态共享(可实现)
核心逻辑是通过根域Cookie实现同根域下所有子域的登录凭证共享,具体配置步骤如下:
- 首先修改全局Session配置,在
.env文件中设置SESSION_DOMAIN=.example.com,前缀的点代表所有一级域为example.com的子域均可读取该Session Cookie - 调整
config/sanctum.php中的stateful配置项,添加所有需要共享登录状态的子域规则,可直接配置为['*.example.com', 'example.com']实现全子域适配 - 修改
config/cors.php配置,将supports_credentials设为true,同时allowed_origins配置放开所有业务子域的跨域权限 - 前端Vue项目中,全局配置axios的
withCredentials: true,确保所有跨子域请求都会自动携带根域Cookie - 若使用
stancl/tenancy多租户扩展包,需注意不要让租户独立配置覆盖全局Session域名配置,可将Session域名设为全局固定值避免冲突 - 不同租户之间的登录状态隔离可通过在用户鉴权逻辑中加入当前租户ID校验实现,确保仅同租户的关联子域(如store1的前端、管理端、API端)可以共享登录状态
二、Laravel子域生成与匹配方法
首先需要提前在域名服务商处配置泛域名解析,将*.example.com、*.admin.example.com、*.api.example.com全部解析到你的应用服务器IP,同时Web服务器(Nginx/Apache)配置泛域名规则,将所有子域请求转发到Laravel入口文件。
- Laravel本身内置子域路由能力,可通过路由分组动态匹配子域参数,示例代码如下:
// 主域路由 Route::domain('example.com')->group(function () { // 主站业务逻辑 }); // 租户前端子域路由 Route::domain('{tenant_slug}.example.com')->group(function () { // 自动获取租户标识参数,可用于初始化租户配置 }); // 租户管理端子域路由 Route::domain('{tenant_slug}.admin.example.com')->group(function () { // 管理端业务逻辑 }); // 租户API子域路由 Route::domain('{tenant_slug}.api.example.com')->group(function () { // API业务逻辑 });
- 若使用
stancl/tenancy扩展包,无需手动处理子域匹配逻辑,创建租户时同步写入子域名标识到租户域名表,扩展包会自动完成子域识别、租户初始化、数据隔离等全流程处理 - 本地开发可通过修改hosts文件模拟子域,添加对应子域指向本地IP即可完成测试
额外开发建议
- 优先使用Sanctum的Cookie会话模式实现登录,安全性和易用性均优于令牌存储方案
- 若采用单库多租户架构,务必添加租户ID全局查询作用域,避免跨租户数据泄露
内容的提问来源于stack exchange,提问作者Dominik Balogh
相关产品推荐
相关产品推荐

