
本文详解如何在 laravel 中实现多租户(multi-tenancy)架构,支持单数据库或多数据库隔离,满足多公司数据安全、单点登录、统一前端等核心需求,并推荐经过生产验证的 tenancy for laravel 方案。
本文详解如何在 laravel 中实现多租户(multi-tenancy)架构,支持单数据库或多数据库隔离,满足多公司数据安全、单点登录、统一前端等核心需求,并推荐经过生产验证的 tenancy for laravel 方案。
在构建面向多企业的 SaaS 应用时(如本例中 Angular 前端对接 Laravel 后端),关键挑战在于:如何让不同公司(租户)共享同一套代码与前端,却严格隔离其数据与业务逻辑,同时仅需一次认证即可无缝访问所属租户环境? 简单的“按公司字段过滤”(soft-tenancy)或“为每家公司部署独立 Laravel 实例”(hard-tenancy)均存在明显缺陷:前者易因开发疏忽导致越权访问(违反安全目标①),后者则带来运维复杂、资源浪费、升级困难等问题,且难以优雅支持“一个邮箱绑定多个公司”(目标②)和“单 Angular 前端动态路由至对应后端”(目标③④)。
推荐方案:采用 Tenancy for Laravel(https://www.php.cn/link/6b60c00e7ba87f39db2698a1ea7fdf33)
这是目前 Laravel 生态中最成熟、文档完善、社区活跃的多租户解决方案,原生支持两种核心隔离模式:
- ✅ Database-per-Tenant(推荐):为每个公司分配独立数据库,物理级隔离,彻底杜绝跨租户数据泄露风险,完美契合安全目标①;
- ✅ Shared Database(单库多租户):所有租户共用一个数据库,通过 tenant_id 字段自动作用于所有 Eloquent 查询(借助全局作用域 + 中间件自动识别租户),更节省资源,但需严格审计所有查询逻辑。
无论哪种模式,Tenancy 均提供统一抽象层:
- 自动根据请求上下文(如子域名 acme.app.com、请求头 X-Tenant-ID 或路由参数)识别当前租户;
- 自动切换数据库连接(多库模式)或注入租户约束(单库模式);
- 无缝集成 Laravel Passport:用户认证仍由主应用(或中央认证服务)统一处理,认证成功后,API 请求携带租户标识(如 JWT claim 或 header),Tenancy 中间件即刻加载对应租户上下文——真正实现「一次登录,直达专属环境」,无需跳转多个登录页(满足目标④)。
快速集成示例(Database-per-Tenant):
# 1. 安装 composer require tenancy/tenancy # 2. 发布配置与迁移 php artisan vendor:publish --provider="Tenancy\Providers\TenancyServiceProvider" php artisan migrate --database=tenant # 3. 创建租户(例如为 Acme 公司) php artisan tenancy:artisan tenant:create acme --database=acme_db
// 4. 在 API 路由中启用租户识别(如基于子域名)
Route::middleware('tenancy')->group(function () {
Route::apiResource('projects', ProjectController::class);
});
⚠️ 关键注意事项:
- 认证解耦:Passport 的 oauth_clients 和 oauth_access_tokens 表建议保留在主数据库(非租户库),避免重复维护;租户专属模型(如 Company, Project)则存于租户库。Tenancy 提供 TenantConfig 可精细控制哪些表/连接属于租户范围。
- 前端适配:Angular 不再硬编码 api_url。登录后,后端返回租户标识(如 acme),前端据此构造请求 URL(如 https://acme.yourapp.com/api/projects),由 Nginx/Apache 或 Laravel 自动解析子域名并触发 Tenancy 中间件。
- 多租户登录支持:用户表(users)可置于主库,通过 user_tenant 关联表实现「一用户多公司」;登录时返回用户可访问的所有租户列表,前端提供租户切换 UI。
综上,Tenancy for Laravel 并非简单插件,而是一套完整的多租户生命周期管理框架——它将复杂的数据库切换、中间件路由、事件钩子、队列隔离等细节封装为开箱即用的能力,让你专注业务逻辑,而非基础设施。对于追求安全、可扩展与可维护性的 SaaS 项目,它是当前 Laravel 生态下最值得信赖的选择。











