defrostedtuna/alnus

1.03 2018-01-31 14:39 UTC

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 检查都会模仿权限名称,允许非常容易地使用。额外的好处是,您将为特殊情况进行额外逻辑,例如检查用户是否拥有帖子,而无需过多地弄乱您的代码。