althinect/filament-spatie-roles-permissions


README

Latest Version on Packagist Total Downloads GitHub Actions

此插件基于 Spatie的权限 包构建。

提供角色和权限的资源

权限和政策生成

  • 检查 config/filament-spatie-roles-permissions-config.php

支持团队权限

  • 确保 config/permission.php 文件中的 teams 属性设置为 true

更新

执行 composer update 后,运行

php artisan vendor:publish --tag="filament-spatie-roles-permissions-config" --force

请注意,您的现有设置将被覆盖

如果您喜欢我们的工作,请不要忘记为项目 STAR

安装

您可以通过 composer 安装此包

composer require althinect/filament-spatie-roles-permissions

由于此包依赖于 Spatie的权限 包,您必须通过运行以下命令发布迁移

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

将插件添加到 AdminPanelProvider

use Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsPlugin;

$panel
    ...
    ->plugin(FilamentSpatieRolesPermissionsPlugin::make())

现在,您应该添加 Spatie-Permission 包所需的任何其他配置。

注意: 这将覆盖您的现有配置文件。您可以使用以下命令发布包的配置文件:

php artisan vendor:publish --tag="filament-spatie-roles-permissions-config" --force

您可以使用以下命令发布翻译:

php artisan vendor:publish --tag="filament-spatie-roles-permissions-translations"

不要忘记将 HasRoles 特性添加到您的用户模型中。

 // The User model requires this trait
 use HasRoles;

使用方法

表单

您可以将以下内容添加到您的用户资源中的 form 方法中

return $form->schema([
    Select::make('roles')->multiple()->relationship('roles', 'name')
])

除了添加到 UserResource 的字段外,还会在 角色和权限 下发布两个资源。您可以使用这些资源来管理角色和权限。

生成权限

您可以通过以下命令生成权限

php artisan permissions:sync

这将不会删除任何现有的权限。但是,如果您想删除所有现有的权限,请运行

php artisan permissions:sync -C|--clean

示例

如果您有一个 Post 模型,它将生成以下权限

view-any Post
view Post
create Post
update Post
delete Post
restore Post
force-delete Post
replicate Post
reorder Post

生成策略

要生成策略,请使用以下命令。这不会替换任何现有的策略

php artisan permissions:sync -P|--policies

覆盖现有策略

这将覆盖现有的策略类

php artisan permissions:sync -O|--oep

角色和权限策略

如果您想控制导航菜单中资源的可见性,请创建一个 RolePolicyPermissionPolicy。确保将它们添加到 AuthServiceProvider。

ℹ️ 信息: Laravel 11 移除了 AuthServiceProvider,因此在这种情况下,我们需要使用 AppServiceProvider

use App\Policies\RolePolicy;
use App\Policies\PermissionPolicy;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

Gate::policy(Role::class, RolePolicy::class);
Gate::policy(Permission::class, PermissionPolicy::class);

忽略提示

您可以通过添加标志 -Y--yes-to-all 忽略任何提示

仅推荐用于新项目,因为它将替换策略文件

php artisan permissions:sync -COPY

添加超级管理员

  • 创建一个名为 Super Admin 的角色并将该角色分配给用户
  • 将以下特性添加到用户模型中
use Althinect\FilamentSpatieRolesPermissions\Concerns\HasSuperAdmin;

class User extends Authenticatable{

...
use HasSuperAdmin;
  • 在 AuthServiceProvider 的 boot 方法中添加以下内容
Gate::before(function (User $user, string $ability) {
    return $user->isSuperAdmin() ? true: null;     
});

守卫名称

当您使用除 web 之外的任何守卫时,必须将守卫名称添加到 config/auth.php 文件中。例如:如果您使用 api 守卫,您应该在 guards 数组中添加以下内容

'guards' => [
    ...

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

多租户

  • 确保在 config/permission.php 中设置以下内容
'teams' => true
  • 确保 config/permission 中的 team_model 设置正确。
  • 创建一个扩展 Spatie\Permission\Models\Role 的角色模型
  • config/permission.php 中的模型替换为新创建的模型
  • 在两个模型中添加 team 关系
...
public function team(): BelongsTo
{
    return $this->belongsTo(Team::class);
}
  • 将以下内容添加到 AdminPanelProvider 以支持租户功能
use Althinect\FilamentSpatieRolesPermissions\Middleware\SyncSpatiePermissionsWithFilamentTenants;

$panel
    ...
    ->tenantMiddleware([
        SyncSpatiePermissionsWithFilamentTenants::class,
    ], isPersistent: true)
  • 在您的 UserResource 中使用以下内容
Forms\Components\Select::make('roles')
            ->relationship(name: 'roles', titleAttribute: 'name')
            ->saveRelationshipsUsing(function (Model $record, $state) {
                 $record->roles()->syncWithPivotValues($state, [config('permission.column_names.team_foreign_key') => getPermissionsTeamId()]);
            })
           ->multiple()
           ->preload()
           ->searchable(),

请遵循 Filament 多租户 上的说明

配置

filament-spatie-roles-permissions.php 配置文件中,您可以自定义权限生成

安全

如果您发现任何与安全相关的问题,请创建一个问题。

鸣谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 以获取更多信息。

Laravel 包模板

此包使用 Laravel 包模板 生成。