eminiarts / 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/express-4.18.2
- dev-dependabot/npm_and_yarn/qs-6.5.3
- dev-dependabot/npm_and_yarn/decode-uri-component-0.2.2
- dev-dependabot/npm_and_yarn/loader-utils-1.4.2
- dev-dependabot/npm_and_yarn/url-parse-1.5.10
- 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 auto-updated.
Last update: 2024-09-11 01:32:50 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项目表示巨大的感谢,他们的工作非常出色!


