
本文详解如何在 laravel 中优雅实现多公司(多租户)数据隔离,支持单数据库或多数据库部署,兼顾安全性、灵活性与统一认证体验,避免手动分库分表或重复部署运维负担。
本文详解如何在 laravel 中优雅实现多公司(多租户)数据隔离,支持单数据库或多数据库部署,兼顾安全性、灵活性与统一认证体验,避免手动分库分表或重复部署运维负担。
在 SaaS 类应用中,为不同客户(公司)提供逻辑隔离、数据安全、资源共享的后端服务,是核心架构挑战。针对您提出的场景——Angular 前端复用、单点登录、多公司数据严格隔离、且支持用户跨公司关联——多租户(Multi-Tenancy)架构是比“克隆实例”或“全表加 company_id”更专业、可维护性更高的解决方案。
✅ 推荐方案:Tenancy for Laravel
Tenancy for Laravel 是 Laravel 生态中最成熟、文档完善、生产就绪的多租户扩展包。它原生支持两种主流隔离模式:
- Database-per-Tenant(推荐):每个租户拥有独立数据库,实现最高级别数据隔离与性能隔离,天然满足「绝不允许跨公司访问」的安全目标;
- Shared Database(单库多租户):所有租户共用一个数据库,通过 tenant_id 字段 + 全局作用域(Global Scopes)自动过滤数据,节省资源但需严谨审计中间件与查询逻辑。
无论哪种模式,Tenancy 都能无缝集成 Laravel Passport,实现「一次登录、全域通行」:
// 用户登录后,Passport 生成标准 access_token
// Tenancy 通过中间件自动识别当前请求所属租户(如通过子域名 tenant1.app.com 或请求头 X-Tenant-ID)
// 所有 Eloquent 查询自动注入租户上下文,无需手动添加 where('company_id', $user->company_id)? 快速集成示例(Database-per-Tenant)
-
安装:
composer require tenancy/tenancy php artisan vendor:publish --provider="Tenancy\Tenancy\Providers\TenancyServiceProvider" php artisan migrate
-
配置租户识别方式(例如子域名):
// config/tenancy.php 'tenant_finder' => Tenancy\Identification\Finder\DomainFinder::class,
-
创建租户(如为新公司开通服务):
Tenant::new()->withDomains(['acme.example.com'])->create(); // 自动创建数据库、运行迁移、播种基础数据
Passport 认证保持不变,Tenancy 会自动将当前租户绑定到 Auth::user() 的上下文中,所有模型操作默认限定于该租户数据库。
⚠️ 关键注意事项
- 避免硬编码租户切换:切勿在代码中手动调用 DB::connection('tenant') —— Tenancy 已通过 TenantManager 和数据库连接代理全自动处理;
- 队列与任务隔离:启用 tenancy/queues 扩展,确保 Artisan 命令、队列任务、定时任务均在正确租户上下文中执行;
- 文件存储隔离:使用 Storage::disk('tenant') 配合 tenancy/filesystem 插件,确保上传文件按租户隔离;
- 前端适配极简:Angular 无需修改 api_url,只需统一指向主域名(如 api.example.com),由 Nginx/Apache 根据子域名反向代理至同一 Laravel 实例;租户识别完全由后端完成。
? 总结
相比 Docker 实例克隆(运维复杂、资源浪费、升级困难)或全表加 company_id(易漏查、权限绕过风险高、跨租户查询难审计),Tenancy 提供了开箱即用、符合 Laravel 惯例、安全可控的多租户能力。它完美契合您的四大目标:
✅ 数据绝对隔离(数据库级)
✅ 用户可归属多个租户(通过 tenant_user 中间表)
✅ 单一 Angular 前端 + 统一 API 入口
✅ 一次 OAuth2 登录,自动路由至对应租户上下文
建议立即从 Tenancy 官方文档 开始搭建 PoC,其活跃社区与丰富插件生态(如 Scout、Cashier、Nova 集成)将显著加速您的 SaaS 产品交付。


















