
本文介绍如何基于 tenancy for laravel 实现安全、可扩展的多租户架构,支持每个公司(租户)数据完全隔离,同时复用同一套前端与认证体系,满足多对多用户归属、单点登录与严格数据隔离等核心需求。
本文介绍如何基于 tenancy for laravel 实现安全、可扩展的多租户架构,支持每个公司(租户)数据完全隔离,同时复用同一套前端与认证体系,满足多对多用户归属、单点登录与严格数据隔离等核心需求。
在 SaaS 类 Laravel 应用中,为不同客户提供独立、安全的数据环境是常见且关键的需求。直接克隆应用实例(如 Docker 多部署)虽逻辑隔离彻底,却带来运维复杂、代码同步困难、认证链断裂等问题;而简单添加 company_id 字段的“软多租户”方案,则面临 SQL 注入绕过、Eloquent 查询遗漏、软删除误操作等严重安全隐患,难以满足“绝不允许跨租户访问”的强安全目标。
Tenancy for Laravel 是当前最成熟、生产就绪的解决方案。它原生支持两种隔离模式:
- ✅ Database-per-Tenant(推荐):为每个租户分配独立数据库(如 tenant_acme_corp),物理级隔离,杜绝任何跨库查询可能;
- ✅ Shared Database with Schema Isolation:同一数据库内通过 schema(PostgreSQL)或前缀表名(MySQL)实现逻辑隔离,兼顾资源效率与安全性。
安装与基础配置仅需数步:
# 1. 安装包(Laravel 10+) composer require tenancy/tenancy # 2. 发布配置与迁移 php artisan vendor:publish --provider="Tenancy\Providers\TenancyServiceProvider" php artisan migrate --path=vendor/tenancy/tenancy/database/migrations # 3. 启用数据库驱动(.env) TENANCY_DRIVER=database TENANCY_DATABASE_PREFIX=tenant_
关键安全机制由框架自动注入:
- 所有 Eloquent 模型默认绑定当前租户上下文(Tenant::current());
- 数据库连接在请求生命周期内动态切换,无需手动 DB::connection('tenant_x');
- Passport 认证自动适配租户上下文——用户凭据仅在其所属租户数据库内校验,天然支持“同一邮箱隶属多个租户”(如管理员跨公司管理)。
前端 Angular 保持极简集成:
仅需在登录成功后,从 /api/tenants/me 接口获取当前租户标识(如 acme.corp),并将其作为请求 Header(如 X-Tenant-Identifier: acme.corp)发送。Laravel 中间件自动解析并初始化租户上下文,后续所有业务逻辑(包括 Passport token 验证、模型查询、队列任务)均运行于该租户沙箱内。
⚠️ 重要注意事项:
- 避免全局查询:禁用 Model::all()、Model::where(...)->get() 等未显式限定租户的调用;Tenancy 提供 Tenant::run($id, fn() => {...}) 显式切换上下文用于后台任务;
- 队列与命令行:Artisan 命令和队列任务默认无租户上下文,必须通过 --tenant=xxx 参数或 Tenant::for($tenant)->execute(...) 显式指定;
- 缓存与 Session:启用 tenant 缓存驱动(CACHE_DRIVER=tenant),确保 Redis key 自动带租户前缀;
- 文件存储:使用 Storage::disk('tenant')->put(...) 而非 public 或 local,实现租户级文件隔离。
综上,Tenancy for Laravel 不仅解决了“一应用多客户”的架构难题,更通过深度框架集成,将安全责任从开发者转移到基础设施层——真正实现“写一次业务逻辑,自动获得租户安全”。对于追求高可靠性、低维护成本的 SaaS 项目,这是目前 Laravel 生态中最值得信赖的多租户落地路径。











