pktharindu/nova-permissions

Laravel Nova 分组权限 (ACL)

v3.0.2 2024-03-23 06:30 UTC

README

banner that says Nova Permissions

GitHub Packagist Packagist

通过基于角色的访问控制 (RBAC) 为您的 Nova 安装添加基于授权的权限。角色在数据库中定义,而权限在代码库中定义。它允许您将权限分组并分配给用户。

如果您喜欢这个包,请通过给仓库加星来表示您的支持。🙏

此包受 Silvanite\Brandenburg 的启发,因为它具有清晰的关注点分离。

角色数据库 中定义

权限代码库 中定义

因此,您将看不到任何 权限 资源。将获取权限的 角色 资源将从您的代码中定义的 Gates 获取。

Tool Demo

安装

您可以通过 composer 在使用 Nova 的 Laravel 应用中安装此包

composer require pktharindu/nova-permissions

使用以下命令发布配置

php artisan vendor:publish --provider="Pktharindu\NovaPermissions\ToolServiceProvider" --tag="config"

配置文件包含一些示例权限供您参考。您可以随意删除它们并添加自己的权限。

// in config/nova-permissions.php

<?php

return [
    /*
    |--------------------------------------------------------------------------
    | User model class
    |--------------------------------------------------------------------------
    */

    'user_model' => 'App\User',

    /*
    |--------------------------------------------------------------------------
    | Nova User resource tool class
    |--------------------------------------------------------------------------
    */

    'user_resource' => 'App\Nova\User',

    /*
    |--------------------------------------------------------------------------
    | The group associated with the resource
    |--------------------------------------------------------------------------
    */

    'role_resource_group' => 'Other',

    /*
    |--------------------------------------------------------------------------
    | Database table names
    |--------------------------------------------------------------------------
    | When using the "HasRoles" trait from this package, we need to know which
    | table should be used to retrieve your roles. We have chosen a basic
    | default value but you may easily change it to any table you like.
    */

    'table_names' => [
        'roles' => 'roles',

        'role_permission' => 'role_permission',

        'role_user' => 'role_user',
        
        'users' => 'users',
    ],

    /*
    |--------------------------------------------------------------------------
    | Application Permissions
    |--------------------------------------------------------------------------
    */

    'permissions' => [
        'view users' => [
            'display_name' => 'View users',
            'description'  => 'Can view users',
            'group'        => 'User',
        ],

        'create users' => [
            'display_name' => 'Create users',
            'description'  => 'Can create users',
            'group'        => 'User',
        ],

        // ...
    ],
];

使用以下命令发布迁移

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

迁移数据库

php artisan migrate

接下来,您必须在 Nova 中注册此工具。这通常在 NovaServiceProvidertools 方法中完成。

// in app/Providers/NovaServiceProvider.php

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

创建一个新的策略

php artisan make:policy RolePolicy --model=\Pktharindu\NovaPermissions\Role

之后,在 AuthServiceProviderboot 方法中注册 RolePolicy 以及您可能有的任何其他策略,并定义以下内容。

// in app/Providers/AuthServiceProvider.php

use Illuminate\Support\Facades\Gate;
use Pktharindu\NovaPermissions\Traits\ValidatesPermissions;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    use ValidatesPermissions;

    protected $policies = [
        \Pktharindu\NovaPermissions\Role::class => \App\Policies\RolePolicy::class,
    ];

    public function boot()
    {
        $this->registerPolicies();

        foreach (config('nova-permissions.permissions') as $key => $permissions) {
            Gate::define($key, function (User $user) use ($key) {
                if ($this->nobodyHasAccess($key)) {
                    return true;
                }

                return $user->hasPermissionTo($key);
            });
        }
    }
}

然后,在您的 User 模型中使用 HasRoles 特性。

// in app/User.php

use Illuminate\Notifications\Notifiable;
use Pktharindu\NovaPermissions\Traits\HasRoles;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasRoles,
        Notifiable;

    // ...
}

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

use Laravel\Nova\Fields\BelongsToMany;

public function fields(Request $request)
{
    return [
        // ...
        BelongsToMany::make('Roles', 'roles', \Pktharindu\NovaPermissions\Nova\Role::class),
    ];
}

安装此包后,您的 Nova 应用程序中将出现一个新的资源 角色

带组的权限

索引视图

Detail View

详细视图

Detail View

编辑视图

Edit View

用法

创建模型策略

要检查权限,您可以创建与 Laravel Nova 一起工作的 模型策略

注意:此包不包含任何内置的 模型策略。配置中定义的示例权限仅供参考。对于您想要授权用户操作的每个 Nova 资源(包括 角色用户 资源),您需要创建一个模型策略。请参阅 Laravel 文档Laravel Nova 文档 获取更多信息。

例如:使用以下代码创建一个新的 PostPolicy

<?php

namespace App\Policies;

use App\Post;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class PostPolicy
{
    use HandlesAuthorization;

    public function view(User $user, Post $post)
    {
        if ($user->hasPermissionTo('view own posts')) {
            return $user->id === $post->user_id;
        }

        return $user->hasPermissionTo('view posts');
    }

    public function create(User $user)
    {
        return $user->hasAnyPermission(['manage posts', 'manage own posts']);
    }

    public function update(User $user, Post $post)
    {
        if ($user->hasPermissionTo('manage own posts')) {
            return $user->id == $post->user_id;
        }
        return $user->hasPermissionTo('manage posts');
    }

    public function delete(User $user, Post $post)
    {
        if ($user->hasPermissionTo('manage own posts')) {
            return $user->id === $post->user_id;
        }

        return $user->hasPermissionTo('manage posts');
    }
}

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

注意:不要忘记在 App\Providers\AuthServiceProvider 中的 $policies 中添加您的策略,并在 config\nova-permissions.php 中定义权限。

hasPermissionTo() 方法确定分配给此用户的角色中是否有特定的权限。

hasAnyPermission() 方法确定模型是否有任何给定的权限。

hasAllPermissions() 方法用于确定模型是否拥有所有给定的权限。

查看自己的帖子 优于 查看帖子,并允许用户仅查看自己的帖子。

管理自己的帖子 优于 管理帖子,并允许用户仅管理自己的帖子。

自定义

使用您自己的资源

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

// in app/Providers/NovaServiceProvider.php

// ...

use App\Nova\Role;

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

然后在您的角色资源中扩展 Pktharindu\NovaPermissions\Nova\Role

// in app/Nova/Role.php

use Pktharindu\NovaPermissions\Nova\Role as RoleResource;

class Role extends RoleResource
{
    // ...
}

支持

如果您需要任何支持,请通过 Twitter 联系我或在此存储库上打开一个问题。

鸣谢

本软件包受 eminiarts/nova-permissionssilvanite/novatoolpermissions 的启发。我想结合两者的优点。感谢这两位作者。

许可协议

版权所有 © 2018-2020 P. K. Tharindu 及其贡献者

本软件包遵循 MIT 许可证,详情请见 LICENSE