boydreams/laravel-nova-manage-permissions

Laravel Nova 分组权限。

dev-master 2019-08-07 02:55 UTC

This package is not auto-updated.

Last update: 2024-09-25 14:22:36 UTC


README

Latest Version on Github

这是一个 Laravel Nova 工具,允许您将权限分组并附加到用户。它使用 Spatie 的 laravel-permission。

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

  1. 安装
  2. 具有组的权限
  3. 自定义
  4. 致谢

image

安装

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

composer require boydreams/nova-permissions

使用以下命令发布迁移

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

迁移数据库

php artisan migrate

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

// in app/Providers/NovaServiceProvider.php

// ...

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

如果您想隐藏工具的某些用户,您可以编写自定义逻辑以查看工具的能力

// in app/Providers/NovaServiceProvider.php

// ...

public function tools()
{
    return [
        // ...
        (new \Boydreams\NovaPermissions\NovaPermissions())->canSee(function ($request) {
            return $request->user()->isSuperAdmin();
        }),
    ];
}


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

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

public function fields(Request $request)
{
    return [
        // ...
        MorphToMany::make('Roles', 'roles', \Boydreams\NovaPermissions\Nova\Role::class),
        MorphToMany::make('Permissions', 'permissions', \Boydreams\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;

    // ...
}

安装此包后,您的 Nova 应用程序中会出现一个新的菜单项 权限 & 角色

具有组的权限

详情视图

image

编辑视图

image

数据库播种

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

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

以下是如何将角色和权限播种到数据库的示例。在 database/seeds 中修改 RolesAndPermissionsSeeder.php。在 $collection 数组中列出您想要为其提供权限的所有模型,并更改超级管理员的电子邮件地址。

<?php

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

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

        $collection = collect([
            'invoices',
            'clients',
            'contacts',
            'payments',
            'teams',
            'users',
            'roles',
            // ... your own models/permission you want to crate
        ]);

        $collection->each(function ($item, $key) {
            // create permissions for each collection item
            Permission::create(['group' => $item, 'name' => 'view ' . $item]);
            Permission::create(['group' => $item, 'name' => 'view own ' . $item]);
            Permission::create(['group' => $item, 'name' => 'manage ' . $item]);
            Permission::create(['group' => $item, 'name' => 'manage own ' . $item]);
            Permission::create(['group' => $item, 'name' => 'restore ' . $item]);
            Permission::create(['group' => $item, 'name' => 'forceDelete ' . $item]);
        });

        // Create a Super-Admin Role and assign all permissions to it
        $role = Role::create(['name' => 'super-admin']);
        $role->givePermissionTo(Permission::all());

        // Give User Super-Admin Role
        $user = App\User::whereEmail('your@email.com')->first(); // enter your email here 
        $user->assignRole('super-admin');
    }
}

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

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

创建模型策略

您可以扩展 Boydreams\NovaPermissions\Policies\Policy 并创建一个与 Nova 一起工作的干净模型策略。

例如:使用 php artisan make:policy ContactPolicy 创建一个新的 Contact 策略,代码如下

<?php
namespace App\Policies;

use Boydreams\NovaPermissions\Policies\Policy;

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

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

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

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

view own contacts 优于 view contacts,并允许用户只能查看他自己的联系人。

manage own contacts 优于 manage contacts,并允许用户只能管理他自己的联系人。

超级管理员

超级管理员可以做任何事情。如果您扩展我们的策略,请确保在您的 App\User 模型中添加 isSuperAdmin() 函数。

<?php
namespace App;

class User {
    /**
     * Determines if the User is a Super admin
     * @return null
    */
    public function isSuperAdmin()
    {
        return $this->hasRole('super-admin');
    }
}

您可以根据需要修改此函数。

为用户范围资源

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

<?php
namespace App\Nova;

use Boydreams\NovaPermissions\Nova\ResourceForUser;

class Contact extends ResourceForUser 
{
    //...
}

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

自定义

使用您自己的资源

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

// in app/Providers/NovaServiceProvider.php

// ...

use App\Nova\Role;
use App\Nova\Permission;

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

致谢

此包受 vyuldashev/nova-permissionsilvanite/novatoolpermissions 的启发。我希望结合两者的特点。感谢这两位作者。此外,还要向 Spatie 的 spatie/laravel-permission 致以崇高的敬意,感谢他们的出色工作!