boydreams / laravel-nova-manage-permissions
Laravel Nova 分组权限。
Requires
- php: >=7.1.0
- spatie/laravel-permission: 2.*
This package is not auto-updated.
Last update: 2024-09-25 14:22:36 UTC
README
这是一个 Laravel Nova 工具,允许您将权限分组并附加到用户。它使用 Spatie 的 laravel-permission。
我们有一个迁移、种子、策略和资源,以提供良好的授权体验。

安装
您可以通过 composer 将此包安装到使用 Nova 的 Laravel 应用中
composer require boydreams/nova-permissions
使用以下命令发布迁移
php artisan vendor:publish --provider="Boydreams\NovaPermissions\ToolServiceProvider" --tag="migrations"
迁移数据库
php artisan migrate
接下来,您必须将工具与 Nova 注册。这通常在 NovaServiceProvider 的 tools 方法中完成。
// 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 应用程序中会出现一个新的菜单项 权限 & 角色。
具有组的权限
详情视图

编辑视图

数据库播种
使用以下命令发布我们的种子
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-permission 和 silvanite/novatoolpermissions 的启发。我希望结合两者的特点。感谢这两位作者。此外,还要向 Spatie 的 spatie/laravel-permission 致以崇高的敬意,感谢他们的出色工作!