graphene-ict / nova-permissions
基于 spatie permissions 的 Nova 权限工具
Requires
- php: ^7.3|^8.0|^8.1
- spatie/laravel-permission: 5.*
This package is auto-updated.
Last update: 2024-09-24 22:10:10 UTC
README
基于 spatie permissions 的 Nova 权限工具
我们已准备好迁移、种子、策略和资源,以提供良好的授权体验。
安装
您可以通过 composer 将此包安装到使用 Nova 的 Laravel 应用程序中
composer require graphene-ict/nova-permissions
数据库迁移
使用以下命令发布迁移
php artisan vendor:publish --provider="GrapheneICT\NovaPermissions\ToolServiceProvider" --tag="migrations"
迁移数据库
php artisan migrate
配置
您必须将工具注册到 Nova 中。这通常在 NovaServiceProvider
的 tools
方法中完成。
// 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
以自动加载种子器。
权限
详细视图
编辑视图
创建模型策略
您可以通过扩展 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 的启发