epigra / nova-permissions
Laravel Nova 分组权限。
Requires
- php: >=7.2.0
- spatie/laravel-permission: 3.*
- dev-master
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- dev-dependabot/npm_and_yarn/url-parse-1.5.3
- dev-dependabot/npm_and_yarn/path-parse-1.0.7
- dev-dependabot/npm_and_yarn/dns-packet-1.3.4
- dev-dependabot/npm_and_yarn/hosted-git-info-2.8.9
- dev-dependabot/npm_and_yarn/lodash-4.17.21
- dev-dependabot/npm_and_yarn/y18n-3.2.2
- dev-dependabot/npm_and_yarn/elliptic-6.5.4
- dev-dependabot/npm_and_yarn/ini-1.3.7
- dev-dependabot/npm_and_yarn/http-proxy-1.18.1
- dev-dependabot/npm_and_yarn/node-sass-4.14.1
- dev-dependabot/npm_and_yarn/websocket-extensions-0.1.4
This package is not auto-updated.
Last update: 2024-09-22 14:45:48 UTC
README
一个 Laravel Nova 工具,允许您将权限分组并附加到用户。它使用 Spatie 的 laravel-permission。
我们有一个迁移、种子、策略和资源,以便提供良好的授权体验。
安装
您可以通过 composer 将此包安装到使用 Nova 的 Laravel 应用中
composer require eminiarts/nova-permissions
使用以下命令发布迁移
php artisan vendor:publish --provider="Eminiarts\NovaPermissions\ToolServiceProvider" --tag="migrations"
迁移数据库
php artisan migrate
接下来,您必须使用 Nova 注册此工具。这通常在 NovaServiceProvider
的 tools
方法中完成。
// in app/Providers/NovaServiceProvider.php // ... public function tools() { return [ // ... new \Eminiarts\NovaPermissions\NovaPermissions(), ]; }
如果您想隐藏工具以供某些用户使用,您可以编写自定义逻辑以确定查看工具的能力
// in app/Providers/NovaServiceProvider.php // ... public function tools() { return [ // ... (new \Eminiarts\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', \Eminiarts\NovaPermissions\Nova\Role::class), MorphToMany::make('Permissions', 'permissions', \Eminiarts\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 应用中会出现一个新的菜单项,称为 权限 & 角色。
分组权限
详细视图
编辑视图
数据库种子
使用以下命令发布我们的种子
php artisan vendor:publish --provider="Eminiarts\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
以自动加载种子。
创建模型策略
您可以通过扩展 Eminiarts\NovaPermissions\Policies\Policy
来扩展模型策略,使其与 Nova 一起工作。
例如:使用以下代码创建一个新的 Contact 策略 php artisan make:policy ContactPolicy
<?php namespace App\Policies; use Eminiarts\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'); } }
您可以按需修改此函数。
为用户指定资源范围
如果您使用我们的策略和种子,用户仍然可以看到其他条目。要仅允许用户查看其自己的条目,而不允许查看其他条目,您可以将以下内容扩展到我们的 Eminiarts\NovaPermissions\Nova\ResourceForUser
类
<?php namespace App\Nova; use Eminiarts\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 [ // ... \Eminiarts\NovaPermissions\NovaPermissionTool::make() ->roleResource(Role::class) ->permissionResource(Permission::class), ]; }
致谢
本包受到了 vyuldashev/nova-permission 和 silvanite/novatoolpermissions 的启发。我想要结合两者的功能。感谢两位作者。此外,还要向 Spatie spatie/laravel-permission 表示深深的感谢,他们的工作非常出色!