romegadigital / multitenancy
为 Laravel 应用程序添加基于域名的多租户。
Requires
- spatie/laravel-permission: ^5.10
Requires (Dev)
- nunomaduro/collision: ^6.0
- orchestra/testbench: ^7
README
此包提供了一个方便的方法来为您的 Laravel 应用程序添加多租户。它管理租户的模型和关系,通过子域识别传入流量,并将其与相应的租户关联。未与特定子域或未在租户表中找到匹配租户的用户将显示 403 错误。
注意:在访问作用域子域时保存的任何资源将自动保存到当前租户,根据子域。
注意: admin
子域保留给包以从具有 Super Administrator
角色的用户中删除所有作用域。
目录
安装
1. 使用 composer 安装包
composer require romegadigital/multitenancy
在 Laravel 5.5 及更高版本中,服务提供程序将自动注册。对于旧版本,请在 config/app.php
文件中添加服务提供程序。
'providers' => [ // ... RomegaDigital\Multitenancy\MultitenancyServiceProvider::class, ];
2. 发布配置文件
php artisan vendor:publish --provider="RomegaDigital\Multitenancy\MultitenancyServiceProvider" --tag="config"
3. 运行设置
php artisan multitenancy:install
此命令将:
- 发布和迁移所需的迁移
- 添加
Super Administrator
角色和access admin
权限 - 创建
admin
租户模型
4. 更新您的 .env
文件
包需要知道您的基础 URL,以便根据子域确定哪些内容构成租户。
将此添加到您的 .env
文件中:MULTITENANCY_BASE_URL=
5. 更新您的 User 模型
将 RomegaDigital\Multitenancy\Traits\HasTenants
和 Spatie\Permission\Traits\HasRoles
特性应用到您的 User 模型中
use Spatie\Permission\Traits\HasRoles; use RomegaDigital\Multitenancy\Traits\HasTenants; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasTenants, HasRoles; // ... }
使用
租户需要一个名称来标识租户,以及与该用户关联的子域。示例
tenant1.example.com
tenant2.example.com
注意:您在 config/multitenancy.php
文件中定义基础 URL 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);
创建租户,将它们与用户关联,并使用提供的中间件定义访问规则。请参阅 详细使用说明 以获取示例。
详细使用说明
1. 模型和关系:
使用 Eloquent 访问用户的租户(User::tenants()->get()
)和租户的用户(Tenant::users()->get()
)。将新的租户及其关联的用户添加到数据库中。
2. 中间件:
将 TenantMiddleware
和 GuestTenantMiddleware
添加到您的 app/Http/Kernel.php
文件,并将它们应用到路由上。
租户中间件
protected $middlewareAliases = [ // ... 'tenant.auth' => \RomegaDigital\Multitenancy\Middleware\TenantMiddleware::class, ];
然后您可以使用中间件规则将多租户引入您的路由
Route::group(['middleware' => ['tenant.auth']], function () { // ... });
访客租户中间件
此包包含 GuestTenantMiddleware
中间件,它将租户作用域应用于所有模型,可用于允许访客用户访问与租户相关的页面。您可以在 app/Http/Kernel.php
文件中添加它。
protected $middlewareAliases = [ // ... 'tenant.guest' => \RomegaDigital\Multitenancy\Middleware\GuestTenantMiddleware::class, ];
然后您可以使用中间件规则将多租户引入您的路由
Route::group(['middleware' => ['tenant.guest']], function () { // ... });
3. 模型租户分配:
通过添加特性和迁移使模型租户感知,然后自动应用租户作用域。这允许用户访问 tenant1.example.com
并仅返回 tenant1
的数据。
例如,假设您想让租户管理他们自己的产品
。在您的产品
模型中添加BelongsToTenant
特性。然后运行提供的控制台命令,将必要的关联列添加到现有的products
表中。
use Illuminate\Database\Eloquent\Model; use RomegaDigital\Multitenancy\Traits\BelongsToTenant; class Product extends Model { use BelongsToTenant; // ... }
将租户添加到模型的表中: php artisan multitenancy:migration products
4. 访问当前租户:
使用app('multitenancy')->currentTenant()
获取当前租户模型。
5. 管理员域名访问:
将Super Administrator
角色分配给用户以启用对admin
子域的访问。如有必要,手动创建管理员门户。
6. 自动将用户分配给租户:
启用ignore_tenant_on_user_creation
设置,以自动将用户分配到创建他们的租户子域。
7. 授予用户超级管理
权限:
为了访问admin.example.com
子域,用户需要access admin
权限。此包依赖于Spatie的Laravel Permission包,并在安装此包时自动作为依赖项包含。我们还提供了一个在迁移中已关联相关权限的Super Administrator
角色。将Super Administrator
角色分配给管理员用户以提供他们需要的访问权限。有关将用户添加到适当角色和权限的更多信息,请参阅Laravel Permission文档。
超级管理员是一个具有特权的特殊用户角色。具有此角色的用户可以访问所有模型资源,在不同的租户域名之间导航,并获得进入所有租户作用域都已禁用的admin
子域的权限。
当用户被授予Super Administrator
角色时,他们可以自由访问admin
子域。在这种情况下,租户作用域不适用。此特权允许超级管理员管理所有实例中的数据,而无需对每个单独租户的帐户进行特定访问。
授予用户超级管理
权限:php artisan multitenancy:super-admin admin@example.com
使用Nova进行管理
您可以使用MultitenancyNovaTool在Nova中管理此包的资源。
测试包
使用以下命令运行测试
php vendor/bin/testbench package:test