romegadigital/multitenancy

为 Laravel 应用程序添加基于域名的多租户。

4.0.0 2023-05-31 23:34 UTC

This package is auto-updated.

Last update: 2024-09-30 01:21:41 UTC


README

Total Downloads

此包提供了一个方便的方法来为您的 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\HasTenantsSpatie\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. 中间件:

TenantMiddlewareGuestTenantMiddleware 添加到您的 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