baleethai / nova-permissions
Laravel Nova 分组权限。
Requires
- php: >=7.1.0
- spatie/laravel-permission: 2.*
This package is auto-updated.
Last update: 2024-09-14 22:06:08 UTC
README
一个允许您将权限分组并附加到用户的 Laravel Nova 工具。它使用 Spatie 的 laravel-permission。
我们提供了一个迁移、种子、策略和资源,以提供良好的授权体验。
安装
您可以通过 composer 将此包安装到使用 Nova 的 Laravel 应用中
composer require eminiarts/nova-permissions
使用以下命令发布迁移
php artisan vendor:publish --provider="Baleethai\NovaPermissions\ToolServiceProvider" --tag="migrations"
迁移数据库
php artisan migrate
接下来,您必须在 Nova 中注册此工具。通常在 NovaServiceProvider 的 tools 方法中完成此操作。
// in app/Providers/NovaServiceProvider.php // ... public function tools() { return [ // ... \Baleethai\NovaPermissions\NovaPermissions(), ]; }
最后,将 MorphToMany 字段添加到您的 app/Nova/User 资源中
// ... use Laravel\Nova\Fields\MorphToMany; public function fields(Request $request) { return [ // ... MorphToMany::make('Roles', 'roles', \Baleethai\NovaPermissions\Nova\Role::class), MorphToMany::make('Permissions', 'permissions', \Baleethai\NovaPermissions\Nova\Permission::class), ]; }
安装此包后,您的 Nova 应用中会出现一个名为 权限 & 角色 的新菜单项。
分组权限
详情视图
编辑视图
数据库种子
使用以下命令发布我们的种子器
php artisan vendor:publish --provider="Baleethai\NovaPermissions\ToolServiceProvider" --tag="seeds"
这是一个示例,说明如何使用角色和权限种子数据库。在 database/seeds 中的 RolesAndPermissionsSeeder.php 中修改,将您希望在 $collection 数组中具有权限的所有模型列出,并更改超级管理员的电子邮件。
<?php use App\Role; use App\Permission; use Illuminate\Database\Seeder; 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来自动加载种子器。
创建模型策略
您可以通过扩展 Baleethai\NovaPermissions\Policies\Policy 来扩展 Model 策略,使其与 Nova 一起工作。
例如:使用以下代码创建一个新的 Contact 策略 php artisan make:policy ContactPolicy
<?php namespace App\Policies; use Baleethai\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'); } }
您可以按需修改此函数。
为用户范围资源
如果您使用我们的策略和种子器,用户仍然可以查看其他条目。为了仅允许用户查看自己的条目而无法查看其他条目,您可以像这样扩展我们的 Baleethai\NovaPermissions\Nova\ResourceForUser 类
<?php namespace App\Nova; use Baleethai\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 [ // ... \Baleethai\NovaPermissions\NovaPermissionTool::make() ->roleResource(Role::class) ->permissionResource(Permission::class), ]; }
鸣谢
本包受 vyuldashev/nova-permission 和 silvanite/novatoolpermissions 的启发。我希望将两者的优点结合起来。感谢两位作者。此外,还要向 Spatie 的 spatie/laravel-permission 致以崇高的敬意,感谢他们杰出的工作!


