graphene-ict/nova-permissions

基于 spatie permissions 的 Nova 权限工具

v1.0.2 2022-09-24 17:40 UTC

This package is auto-updated.

Last update: 2024-09-24 22:10:10 UTC


README

基于 spatie permissions 的 Nova 权限工具

我们已准备好迁移、种子、策略和资源,以提供良好的授权体验。

image

  1. 安装
  2. 权限
  3. 自定义
  4. 致谢

安装

您可以通过 composer 将此包安装到使用 Nova 的 Laravel 应用程序中

composer require graphene-ict/nova-permissions

数据库迁移

使用以下命令发布迁移

php artisan vendor:publish --provider="GrapheneICT\NovaPermissions\ToolServiceProvider" --tag="migrations"

迁移数据库

php artisan migrate

配置

您必须将工具注册到 Nova 中。这通常在 NovaServiceProvidertools 方法中完成。

// in app/Providers/NovaServiceProvider.php

// ...

public function tools()
{
    return [
        // ...
        new \GrapheneICT\NovaPermissions\NovaPermissions(),
    ];
}

最后,将 MorphToMany 字段添加到您的 app/Nova/User 资源中

// ...
use Laravel\Nova\Fields\MorphToMany;

public function fields(Request $request)
{
    return [
        // ...
        MorphToMany::make('Roles', 'roles', \GrapheneICT\NovaPermissions\Nova\Role::class),
        MorphToMany::make('Permissions', 'permissions', \GrapheneICT\NovaPermissions\Nova\Permission::class),
    ];
}

将 Spatie\Permission\Traits\HasRoles 特性添加到您的用户模型中

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}

数据库种子

使用以下命令发布我们的种子器

php artisan vendor:publish --provider="GrapheneICT\NovaPermissions\ToolServiceProvider" --tag="seeds"

在您进行任何种子之前,请在您的 env 中设置 admin email 参数

NOVA_PERMISSION_ADMIN_EMAIL = your@email.com

这是一个示例,说明您如何使用角色和权限种子数据库。修改 database/seeds 中的 RolesAndPermissionsSeeder.php。在 $collection 数组中列出您想要为其设置权限的所有模型。创建一个角色并将权限附加到它上

class RolesAndPermissionsSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // Reset cached roles and permissions
        app()[PermissionRegistrar::class]->forgetCachedPermissions();

        $collection = collect([
            User::class,
            Role::class,
            Permission::class,
            // ... // List all your Models you want to have Permissions for.
        ]);

        $adminEmail = env('NOVA_PERMISSION_ADMIN_EMAIL', null);

        if (is_null($adminEmail)) {
            throw new \InvalidArgumentException('Email parameter must be provided!');
        }

        // Create an Admin Role and assign all Permissions
        $role = Role::create(['name' => 'admin']);
        $role->givePermissionTo(Permission::all());

       // Give User Admin Role
         $user = User::whereEmail($adminEmail)->first(); // Change this to your email.
         $user->assignRole('admin');
    }
}

现在您可以种子数据库了。将 $this->call(RolesAndPermissionsSeeder::class); 添加到 DatabaseSeeder

注意:如果不起作用,请运行 composer dumpautoload 以自动加载种子器。

权限

详细视图

grap1

编辑视图

grap2

创建模型策略

您可以通过扩展 GrapheneICT\NovaPermissions\Policies\Policy 来扩展模型策略,使其与 Nova 一起使用。

例如:使用以下代码创建一个新的用户策略 php artisan make:policy UserPolicy

class UserPolicy extends Policy
{
    /**
     * The Permission key the Policy corresponds to.
     *
     * @var string
     */
    public static $key = 'users';
}

现在应该按预期工作。只需创建一个角色,修改其权限,策略就会处理其余部分。

注意:不要忘记将您的策略添加到 App\Providers\AuthServiceProvider$policies 中。

注意:只有当您已根据我们的种子示例创建权限时,才扩展策略。否则,请确保您的表中具有 view users, view own users, manage users, manage own users, restore users, forceDelete users 作为权限,以便扩展我们的策略。

view own users 优于 view users,允许用户仅查看他自己的用户。

manage own users 优于 manage users,允许用户仅管理他自己的用户。

为用户分配作用域资源

如果您使用我们的策略和种子器,用户仍然能够看到其他条目。为了仅允许用户查看他自己的条目而不查看其他条目,您可以像这样扩展我们的 GrapheneICT\NovaPermissions\Nova\ResourceForUser

class User extends ResourceForUser 
{
    //...
}

注意:ResourceForUser 假设资源在数据库中有一个 user_id 列。如果您使用其他列,请随意复制资源的全部内容并修改它。

自定义

使用您自己的资源

如果您想使用您自己的资源类,您可以在注册工具时定义它们

// in app/Providers/NovaServiceProvider.php

// ...

public function tools()
{
    return [
        // ...
        \GrapheneICT\NovaPermissions\NovaPermissionTool::make()
            ->roleResource(Role::class)
            ->permissionResource(Permission::class),
    ];
}

致谢

此包受到 eminiarts/nova-permission 的启发