defrostedtuna / alnus
Requires
- php: >=5.6.4
- illuminate/support: ^5.3
This package is auto-updated.
Last update: 2024-09-20 07:45:21 UTC
README
Alnus 是一个用于向 Laravel 项目添加角色和权限的库,并构建在 Laravel 的 Gate 系统旁边工作。Alnus 山是对某个名为“门”(Gate)的东西的参考。
快速安装
Composer 是安装 Alnus 的最佳方式。
composer require defrostedtuna/alnus
否则,您可以将它放在 composer.json
文件中。
"require": { "defrostedtuna/alnus": "^1.0" },
服务提供者
安装后,您必须将服务提供者放入 config/app.php
'providers' => [ // Lots of providers here DefrostedTuna\Alnus\AlnusServiceProvider::class, // Some other jargon afterwards ],
迁移
已创建迁移以将此直接集成到应用程序中。只需运行 php artisan migrate
即可创建迁移表。
注意: 默认情况下,Alnus 设置为将 uuid 字段作为外键迁移到 users 表。
就我个人而言,我使用 webpatser/laravel-uuid
包来处理这个问题。这里有一篇非常好的文章,介绍了如何在 Laravel 项目中实现 uuid。
特性
要完成设置,请将 RolesAndPermissions
特性附加到您的用户模型上。
<?php namespace App\Models\User; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; use DefrostedTuna\Alnus\Traits\RolesAndPermissions; class User extends Authenticatable { use Notifiable; use RolesAndPermissions;
注意: Alnus 配置为在 App\Models 目录下查找用户模型。如果您想更改此设置,请发布配置文件并将 config/alnus.php
指向您选择的任何位置。
php artisan vendor:publish --provider="DefrostedTuna\Alnus\AlnusServiceProvider"
用法
一旦将 RolesAndPermissions
特性放置在用户模型上,您将有权访问各种函数。
一些示例
// String, Role object, or an array of either. $role = "administrator"; $user->assignRole($role); $user->revokeRole($role); $user->revokeAllRoles(); $user->syncRoles($role); // Also accepts ids as well.
如果您想检查角色和权限怎么办?
// String, Role/Permission object, or an array of either. $role = "moderator"; $permission = "update_post"; $user->hasRole($role); $user->isA($role); // $user->isA('moderator'); $user->isAn($role); //$user->isAn('administrator'); $user->isAbleTo($permission);
创建角色和权限
角色和权限实际上非常简单。它们由名称和标签组成。要创建一个,只需将这些属性分配给记录即可。
$role = new DefrostedTuna\Alnus\Models\Role(); $role->name = 'administrator'; $role->label = 'the site administrator'; $role->save(); $permission = new DefrostedTuna\Alnus\Models\Permission(); $permission->name = 'update_post'; $permission->label = 'Permission to update post'; $permission->save();
最后,将权限附加到角色。
$role->givePermission($permission);
与 Laravel 的 Gate 系统集成
我提到,这个库设计得可以很容易与 Laravel 的 gate 系统一起使用,让我们看看我通常如何做。
假设我们有三个用户,第一个用户是“管理员”,对网站拥有完全控制权。第二个是“版主”,有权更新所有帖子。最后,我们的第三个用户将没有任何权限,只能更新自己的帖子。
我喜欢在项目中使用策略。在这个示例中,我将使用策略,但您也可以随意定义这些策略。
// PostPolicy.php public function before($user, $ability) { if ($user->isAn('administrator') { return true; } } public function update(User $user, Post $post) { return ($user->isAbleTo('update_post') || $user->owns($post)) true : false; }
// routes/web.php Route::get('posts/{post}/edit', [ 'uses' => 'PostController@edit', 'middleware' => 'can:update,post' ]);
如您所看到的,在这个示例中,我们能够检查三个不同的访问级别。首先,管理员在执行检查之前被授予访问权限。具有更新帖子能力的版主被授予访问权限。第三个用户只有在他们是帖子的所有者时才会被授予访问权限,这将阻止他们更改属于其他用户的帖子。
这就是全部。这相当直接,大多数 gate 检查都会模仿权限名称,允许非常容易地使用。额外的好处是,您将为特殊情况进行额外逻辑,例如检查用户是否拥有帖子,而无需过多地弄乱您的代码。