pktharindu / nova-permissions
Laravel Nova 分组权限 (ACL)
Requires
- php: >=7.1.0|^8.0
Requires (Dev)
- laravel/nova: ^4.0
README
通过基于角色的访问控制 (RBAC) 为您的 Nova 安装添加基于授权的权限。角色在数据库中定义,而权限在代码库中定义。它允许您将权限分组并分配给用户。
如果您喜欢这个包,请通过给仓库加星来表示您的支持。🙏
此包受 Silvanite\Brandenburg 的启发,因为它具有清晰的关注点分离。
角色 在 数据库 中定义
和
权限 在 代码库 中定义
因此,您将看不到任何 权限 资源。将获取权限的 角色 资源将从您的代码中定义的 Gates 获取。
安装
您可以通过 composer 在使用 Nova 的 Laravel 应用中安装此包
composer require pktharindu/nova-permissions
使用以下命令发布配置
php artisan vendor:publish --provider="Pktharindu\NovaPermissions\ToolServiceProvider" --tag="config"
配置文件包含一些示例权限供您参考。您可以随意删除它们并添加自己的权限。
// in config/nova-permissions.php <?php return [ /* |-------------------------------------------------------------------------- | User model class |-------------------------------------------------------------------------- */ 'user_model' => 'App\User', /* |-------------------------------------------------------------------------- | Nova User resource tool class |-------------------------------------------------------------------------- */ 'user_resource' => 'App\Nova\User', /* |-------------------------------------------------------------------------- | The group associated with the resource |-------------------------------------------------------------------------- */ 'role_resource_group' => 'Other', /* |-------------------------------------------------------------------------- | Database table names |-------------------------------------------------------------------------- | When using the "HasRoles" trait from this package, we need to know which | table should be used to retrieve your roles. We have chosen a basic | default value but you may easily change it to any table you like. */ 'table_names' => [ 'roles' => 'roles', 'role_permission' => 'role_permission', 'role_user' => 'role_user', 'users' => 'users', ], /* |-------------------------------------------------------------------------- | Application Permissions |-------------------------------------------------------------------------- */ 'permissions' => [ 'view users' => [ 'display_name' => 'View users', 'description' => 'Can view users', 'group' => 'User', ], 'create users' => [ 'display_name' => 'Create users', 'description' => 'Can create users', 'group' => 'User', ], // ... ], ];
使用以下命令发布迁移
php artisan vendor:publish --provider="Pktharindu\NovaPermissions\ToolServiceProvider" --tag="migrations"
迁移数据库
php artisan migrate
接下来,您必须在 Nova 中注册此工具。这通常在 NovaServiceProvider
的 tools
方法中完成。
// in app/Providers/NovaServiceProvider.php public function tools() { return [ // ... new \Pktharindu\NovaPermissions\NovaPermissions(), ]; }
创建一个新的策略
php artisan make:policy RolePolicy --model=\Pktharindu\NovaPermissions\Role
之后,在 AuthServiceProvider
的 boot
方法中注册 RolePolicy
以及您可能有的任何其他策略,并定义以下内容。
// in app/Providers/AuthServiceProvider.php use Illuminate\Support\Facades\Gate; use Pktharindu\NovaPermissions\Traits\ValidatesPermissions; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider { use ValidatesPermissions; protected $policies = [ \Pktharindu\NovaPermissions\Role::class => \App\Policies\RolePolicy::class, ]; public function boot() { $this->registerPolicies(); foreach (config('nova-permissions.permissions') as $key => $permissions) { Gate::define($key, function (User $user) use ($key) { if ($this->nobodyHasAccess($key)) { return true; } return $user->hasPermissionTo($key); }); } } }
然后,在您的 User
模型中使用 HasRoles
特性。
// in app/User.php use Illuminate\Notifications\Notifiable; use Pktharindu\NovaPermissions\Traits\HasRoles; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use HasRoles, Notifiable; // ... }
最后,将 BelongsToMany
字段添加到您的 app/Nova/User
资源中
use Laravel\Nova\Fields\BelongsToMany; public function fields(Request $request) { return [ // ... BelongsToMany::make('Roles', 'roles', \Pktharindu\NovaPermissions\Nova\Role::class), ]; }
安装此包后,您的 Nova 应用程序中将出现一个新的资源 角色。
带组的权限
索引视图
详细视图
编辑视图
用法
创建模型策略
要检查权限,您可以创建与 Laravel Nova 一起工作的 模型策略
。
注意:此包不包含任何内置的
模型策略
。配置中定义的示例权限仅供参考。对于您想要授权用户操作的每个Nova 资源
(包括角色
和用户
资源),您需要创建一个模型策略。请参阅 Laravel 文档 和 Laravel Nova 文档 获取更多信息。
例如:使用以下代码创建一个新的 PostPolicy
<?php namespace App\Policies; use App\Post; use App\User; use Illuminate\Auth\Access\HandlesAuthorization; class PostPolicy { use HandlesAuthorization; public function view(User $user, Post $post) { if ($user->hasPermissionTo('view own posts')) { return $user->id === $post->user_id; } return $user->hasPermissionTo('view posts'); } public function create(User $user) { return $user->hasAnyPermission(['manage posts', 'manage own posts']); } public function update(User $user, Post $post) { if ($user->hasPermissionTo('manage own posts')) { return $user->id == $post->user_id; } return $user->hasPermissionTo('manage posts'); } public function delete(User $user, Post $post) { if ($user->hasPermissionTo('manage own posts')) { return $user->id === $post->user_id; } return $user->hasPermissionTo('manage posts'); } }
它现在应该按预期工作。只需创建一个角色,修改其权限,策略就会处理其余部分。
注意:不要忘记在
App\Providers\AuthServiceProvider
中的$policies
中添加您的策略,并在config\nova-permissions.php
中定义权限。
hasPermissionTo()
方法确定分配给此用户的角色中是否有特定的权限。
hasAnyPermission()
方法确定模型是否有任何给定的权限。
hasAllPermissions()
方法用于确定模型是否拥有所有给定的权限。
查看自己的帖子
优于查看帖子
,并允许用户仅查看自己的帖子。
管理自己的帖子
优于管理帖子
,并允许用户仅管理自己的帖子。
自定义
使用您自己的资源
如果您想使用自己的角色资源,您可以在注册工具时定义它。
// in app/Providers/NovaServiceProvider.php // ... use App\Nova\Role; public function tools() { return [ // ... \Pktharindu\NovaPermissions\NovaPermissions::make() ->roleResource(Role::class), ]; }
然后在您的角色资源中扩展 Pktharindu\NovaPermissions\Nova\Role
。
// in app/Nova/Role.php use Pktharindu\NovaPermissions\Nova\Role as RoleResource; class Role extends RoleResource { // ... }
支持
如果您需要任何支持,请通过 Twitter 联系我或在此存储库上打开一个问题。
鸣谢
本软件包受 eminiarts/nova-permissions 和 silvanite/novatoolpermissions 的启发。我想结合两者的优点。感谢这两位作者。
许可协议
版权所有 © 2018-2020 P. K. Tharindu 及其贡献者
本软件包遵循 MIT 许可证,详情请见 LICENSE。