dev-idkwhoami/cardinal

dev-master 2024-05-24 14:39 UTC

This package is not auto-updated.

Last update: 2024-10-03 05:21:23 UTC


README

一个简单的插件,通过安装即可提供租户、用户、权限和角色管理

此插件高度实验性,不建议在生产应用程序中使用。仍有大量配置是硬编码的,且尚未设置翻译

设置 & 配置

  1. 新 Laravel 安装(或自行承担风险)

    遵循 Laravel 创建项目 指示

  2. 安装 Filament & Panel Builder

    遵循 Filament 安装 指示

  3. 删除迁移

    插件已经设置了以下迁移

    • create_cache_table
    • create_jobs_table
    • create_tenants_table
    • create_roles_table
    • create_users_table
    • create_tenant_user_table
    • create_role_user_table

    在新的项目中,这意味着您需要删除 users, cache, jobs 迁移

  4. 删除用户模型

    插件提供了一个可立即使用的用户模型。因此,您可以删除默认的一个。

  5. 更新 auth 配置中的用户模型

    Laravel 需要知道用户模型的位置,因此请在 config/auth.php 文件中搜索此行

    'model' => env('AUTH_MODEL', App\Models\User::class),

    然后将用户模型类替换如下

    'model' => env('AUTH_MODEL', \DevIdkwhoami\Cardinal\Models\User::class),

  6. 创建 Filament 主题

    使用以下命令为 cardinal 控面板创建主题

     php artisan make:filament-theme cardinal-admin
    
  7. 迁移数据库

    使用以下命令迁移数据库

     php artisan migreate:fresh
    

    可选地,将以下代码添加到您的数据库生成器中

     CardinalPlugin::repository()->seed();
    

    以获取示例数据。

  1. WIP:批量分配保护

    目前,您必须执行 Model::unguard() 才能正确地使用资源

如何使用

像往常一样准备您的 Filament 面板。然后通过 composer 引入插件

composer require dev-idkwhoami/cardinal

安装完成后,您可以使用 ->plugins() 函数将插件添加到面板中。


use DevIdkwhoami\Cardinal\CardinalPlugin;
use DevIdkwhoami\Cardinal\CardinalRepository;

CardinalPlugin::make(function (CardinalRepository $repository) {
    $repository
        /* Only models registered thorugh this function will be handled by the plugin */
        ->models([
            Book::class,
        ])
        ->modelAbilities([
            'users.delete' => fn (User $user, Model $model) => ! $model->is($user),
        ])
        ->permissions([
            PermissionGroup::make('app', 'Application')
                ->weight(99)
                ->permissions([
                    Permission::make('access'),
                ]),
        ]);
})
->dontRunMigrations()
->cardinalPanelId("Something other than Cardinal")
->tenancy();

以下是一个配置为由插件处理的模型示例

class Book extends Model
{
    /* BelongsToTenant ensures this model uses tenancy */
    /* HasPermissions ensures this models abilities are registered and handled automatically */
    use BelongsToTenant, HasFactory, HasPermissions, HasUlids, SoftDeletes;

    protected $fillable = [
        'title',
        'description',
    ];

}

插件

CardinalPlugin 是插件的人口点。它为您提供了主要更改插件行为的函数。

功能

    ->dontRunMigrations() // prevents the plugin from running its migrations by itself
    ->cardinalPanelId("Something other than Cardinal") // sets the panel id of the internal CardinalPanel
    ->tenancy() // enables tenancy on the panel (make sure your models are prepared)

仓库

CardinalRepository 是一个对象,它保存了不同面板注册的所有信息。它为您提供了注册模型和权限的函数。

功能

    ->models([...]) // registers your models with the plugin
    ->modelAbilities([...]) // allows you to implement custom permission logic for "magic permissions"
    ->permissions([...]) // registers custom permissions with the plugin

权限组和权限

在面板上注册插件时,通常您不需要注册任何权限,如果模型使用 HasPermissions 特性,并将其添加到 ->models() 数组中。但如果出于任何原因需要注册额外的权限,您可以这样做

所有权限都需要一个权限组,要创建一个,请执行以下操作

use \DevIdkwhoami\Cardinal\Authorization\PermissionGroup;

PermissionGroup::make('extra')
    ->permissions([
        // ...
    ])

make() 函数接受比仅仅组键更多的参数

  • key 是权限组的唯一前缀
  • name 用作 PermissionTabs 表单块上的标签
  • weight 用于在 PermissionTabs 表单块上排序选项卡
  • description 允许您向权限添加更多详细信息
use \DevIdkwhoami\Cardinal\Authorization\PermissionGroup;

PermissionGroup::make('extra', 'A Name For Displaying', 42, "A description for more information")
    ->permissions([
        // ...
    ])

现在,要创建一个权限,您可以这样做

use \DevIdkwhoami\Cardinal\Authorization\PermissionGroup;
use \DevIdkwhoami\Cardinal\Authorization\Permission;

PermissionGroup::make('extra', 'A Name For Displaying', 42, "A description for more information")
    ->permissions([
        Permission::make('supersecrect'),
    ])

这里的make()函数也接受与权限组相同的参数

特性

此插件使用特性来处理权限、租户等。

  • BelongsToTenant

    此特性为模型添加了tenant()关系(请确保在迁移中添加了tenant_id列)

  • HasPermissions

    具有此特性的模型将由权限系统自动处理,默认的纤维能力作为权限提供

  • HoldsPermissions

    具有此特性的模型可以持有权限(请确保在迁移中添加了permissions json列)

  • MutatesPermissions

    任何使用PermissionTabs表单块的页面都需要添加此特性,这确保权限被合并到permissions列,并格式正确,包括将一个组的“所有权限”缩短为group.*

表单 & 表格块

此插件提供了一组预构建的块以供重复使用。

表单块

  • PanelsAccessList

    此块提供了一个部分或预配置的Checkboxlist,用于授予对面板的访问权限。此组件期望在模型上有一个panels json列

  • PermissionTabs

    此块提供了一个标签部分,用于授予通过插件注册的权限。此组件期望在模型上有一个permissions json列

  • RolesList

    此块提供了一个部分或预配置的Checkboxlist,用于授予角色。此组件期望在模型上有一个roles关系

  • TenantsList

    此块提供了一个部分或预配置的Checkboxlist,用于将用户分配给租户。此组件期望在模型上有一个tenants关系

  • TimestampBlock

    此块提供了一个字段集或预配置的日期时间字段集,以显示模型的时间戳(created_at, updated_at, deleted_at)的统一方式

表格块

  • TimestampColumns

    此块提供了一个预配置的日期时间列集,以显示模型时间戳(created_at, updated_at, deleted_at)的统一方式