jeffersonsimaogoncalves / multitenancy
为 Laravel 应用程序添加基于域名的多租户功能。
Requires
- php: ^7.4|^8.0
- spatie/laravel-permission: ^3.0|^4.0|^5.0
Requires (Dev)
- codedungeon/phpunit-result-printer: ^0.26.0
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^8.0
README
此包旨在快速方便地将多租户功能添加到您的 Laravel 应用程序中。它简单地为租户和模型创建模型和关系。包通过子域名识别传入流量,并在租户表中找到相应的租户。如果没有找到或用户未与特定子域名关联,用户将遇到403错误。
admin
子域名保留给包使用。它用于自动从具有 超级管理员
角色的用户中删除所有作用域。
要将资源范围限定为当前访问的子域名,您只需将一个 单个特质 添加到模型中,并将一个 外键关系 添加到模型的表中。包中间件将自动为相关模型应用作用域。
在访问范围子域名时保存的任何资源都将自动根据子域名针对当前租户保存。
安装
您可以通过 composer 安装该包
composer require jeffersonsimaogoncalves/multitenancy
在 Laravel 5.5 中,服务提供程序将自动注册。在框架的旧版本中,您应该在 config/app.php
文件中添加服务提供程序
'providers' => [ // ... JeffersonSimaoGoncalves\Multitenancy\MultitenancyServiceProvider::class, ];
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="JeffersonSimaoGoncalves\Multitenancy\MultitenancyServiceProvider" --tag="config"
如果您希望用户自动分配到创建的租户,可以启用 ignore_tenant_on_user_creation
设置。
您可以通过运行以下命令自动化大部分设置
php artisan multitenancy:install
它将
publish
和migrate
必要的迁移- 添加
超级管理员
角色和访问管理
权限 - 添加
admin
租户模型
使用
首先,将 JeffersonSimaoGoncalves\Multitenancy\Traits\HasTenants
和 Spatie\Permission\Traits\HasRoles
特质添加到您的用户模型中
use Spatie\Permission\Traits\HasRoles; use JeffersonSimaoGoncalves\Multitenancy\Traits\HasTenants; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasTenants, HasRoles; // ... }
该包依赖于 Eloquent,因此您可以使用 User::tenants()->get()
访问用户的租户。
相反,您可以使用 Tenant::users()->get()
访问租户的用户。
租户需要名称来标识租户以及与该用户关联的子域名。例如
tenant1.example.com
tenant2.example.com
这些值可以按如下方式添加到数据库中
Tenant::create([ 'name' => 'An Identifying Name', 'domain' => 'tenant1' ]); Tenant::create([ 'name' => 'A Second Customer', 'domain' => 'tenant2' ]);
然后,您可以将用户模型附加到租户
$user = User::first(); Tenant::first()->users()->save($user);
中间件
认证
此包包含 TenantMiddleware
中间件,它扩展了 Laravel 的 Illuminate\Auth\Middleware\Authenticate
。您可以在 app/Http/Kernel.php
文件中添加它。
protected $routeMiddleware = [ // ... 'tenant.auth' => \JeffersonSimaoGoncalves\Multitenancy\Middleware\TenantMiddleware::class, ];
然后,您可以使用中间件规则将多租户功能引入到您的路由中
Route::group(['middleware' => ['tenant.auth']], function () { // ... });
访客租户
此包包含 GuestTenantMiddleware
中间件,它将租户作用域应用于所有模型,并且可以用于允许访客用户访问租户相关页面。您可以在 app/Http/Kernel.php
文件中添加它。
protected $routeMiddleware = [ // ... 'tenant.guest' => \JeffersonSimaoGoncalves\Multitenancy\Middleware\GuestTenantMiddleware::class, ];
然后,您可以使用中间件规则将多租户功能引入到您的路由中
Route::group(['middleware' => ['tenant.guest']], function () { // ... });
模型的租户分配
通过将特质和迁移添加到模型中,模型可以自动继承当前租户的作用域。这允许用户访问 tenant1.example.com
并仅返回 tenant1
的数据。
例如,假设您想让租户管理自己的产品
。在您的产品
模型中,添加BelongsToTenant
特性。然后运行提供的控制台命令来将必要的关系列添加到现有的products
表中。
use Illuminate\Database\Eloquent\Model; use JeffersonSimaoGoncalves\Multitenancy\Traits\BelongsToTenant; class Product extends Model { use BelongsToTenant; // ... }
提示 如果用户被分配了
超级管理员
访问权限,他们就能访问admin
子域名,并且租户范围将不会注册。这允许您无需对每个租户的账户进行单独访问,即可管理所有实例的数据。
获取当前租户
您可以得到当前租户模型
app('multitenancy')->currentTenant();
提供对管理域的访问
为了访问admin.example.com
子域名,用户需要访问admin
权限。此包依赖于Spatie的Laravel Permission包,并在安装此包时自动作为依赖项包含。我们还提供了一个在迁移中具有相关权限的超级管理员
角色。将超级管理员
角色分配给管理员用户以提供他们所需的访问权限。有关将用户添加到适当角色和权限的更多信息,请参阅Laravel Permission文档。
在安装过程中将自动创建管理门户的子域名,但您可以手动添加如下:
Tenant::create([ 'name' => 'Admin Portal', 'domain' => 'admin' ]);
控制台命令
生成迁移以将租户添加到现有模型的表中
php artisan multitenancy:migration products
将用户超级管理员
权限和admin
租户分配给用户
php artisan multitenancy:super-admin admin@example.com
使用 Nova 管理
有一个独立的Nova 包可用于在Nova中管理此包中使用的资源。
问题报告
如果您对此插件有任何问题或任何错误,请在GitHub上创建一个问题。
致谢
本作品基于RomegaDigital的代码。