kordy / auzo

此包已被弃用且不再维护。未建议替代包。

Laravel 授权的中央管理界面

维护者

详细信息

github.com/thekordy/auzo

源代码

问题

安装: 98

依赖者: 0

建议者: 0

安全: 0

星星: 10

关注者: 5

分支: 1

公开问题: 0

类型:

v1.1.6 2017-04-06 16:29 UTC

This package is auto-updated.

Last update: 2021-05-06 02:18:05 UTC


README

为 Laravel 5.1, 5.2 和 5.3 提供数据库和用户角色的 Laravel 授权的中央管理。

你是否想过将策略或条件应用于每个权限作为限制,例如:允许认证用户修改帖子,但只有在他是帖子作者、或与作者在同一组、或帖子未发布的情况下...

与其他基于角色的包不同,此包通过条件/策略限制用户的角色权限,遵循 Laravel 授权的基于属性的访问控制(ABAC)方法。

将安装数据库表以存储能力、用户角色、权限以及每个权限的定制条件/策略。

AuzoTools 包是必需的,并且将被安装,它提供了一些便于 Laravel 授权管理的工具。

此包可以做什么

  1. 管理能力
  2. 管理角色
  3. 管理条件/策略
  4. 管理权限
  5. 生成能力

安装

您可以通过 composer 安装此包

composer require kordy/auzo

必须安装此服务提供者。

// config/app.php
'providers' => [
    ...
    Kordy\Auzo\AuzoServiceProvider::class,
    Kordy\AuzoTools\AuzoToolsServiceProvider::class,
];

您可以使用以下命令发布迁移

php artisan vendor:publish --provider="Kordy\Auzo\AuzoServiceProvider" --tag="migrations"

迁移发布后,您可以通过运行迁移来创建角色和权限表

php artisan migrate

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Kordy\Auzo\AuzoServiceProvider" --tag="config"

最后,您必须将 HasRoleTrait 特性添加到您想要分配角色的用户模型中。

// App\User.php

class User extends ...
{
    use ..., Kordy\Auzo\Traits\HasRoleTrait;
    ...

自定义

您可以通过配置文件替换或扩展包的任何模型,创建自己的类,使用模型特质,修改任何函数,只需在 config/auzo.php 文件中添加新类路径即可。

config/auzo.php 内容

/*
    /*
    |--------------------------------------------------------------------------
    | Auzo Authorize Registrar
    |--------------------------------------------------------------------------
    |
    | You may here add custom registrar where the Laravel Gate abilities are defined
    |
    */

    'registrar' => \Kordy\Auzo\Services\PermissionRegistrar::class,

    /*
    |--------------------------------------------------------------------------
    | Auzo models paths
    |--------------------------------------------------------------------------
    |
    | You may here add custom models paths to be used instead of models included
    | with the package
    |
    */

    'models' => [

        'user' => $user_model,

        'ability' => \Kordy\Auzo\Models\Ability::class,

        'policy' => \Kordy\Auzo\Models\Policy::class,

        'permission' => \Kordy\Auzo\Models\Permission::class,

        'role' => \Kordy\Auzo\Models\Role::class,
    ],

用法

能力

默认情况下,Laravel 授权能力是通过服务提供者静态定义的,此包通过在数据库中创建它们并提供更多灵活性来自动定义。

使用 AuzoAbility Facade 管理能力

AuzoAbility::create([
    'name' => 'ability.name',
    'label' => 'Abiliy Label',
    'tag' => 'ability.tag'
]);

使用 auzo:ability artisan 命令管理能力

# create new ability
php artisan auzo:ability create 'ability.index' --label='Ability Index' --tag='ability'
# delete ability
php artisan auzo:ability delete 'ability.index'

角色

Auzo 采用基于角色的访问控制(RBAC)方法,所有用户都通过其角色获得权限,这有助于提高可用性和可扩展性,并保持不同角色之间政策和策略的稳固和非冲突性,每个用户仅允许一个角色。

使用 AuzoRole Facade 管理角色

$role = AuzoRole::create([
    'name' => 'testRole',
    'description' => 'test role description'
]);

使用auzo:role artisan命令管理角色

# create new role
php artisan auzo:role create 'testRole' --description='testing role'
# delete role
php artisan auzo:role delete 'testRole'

使用hasRole trait关系将角色分配给用户

// by role instance
$user->assignRole($role);
// or by role id
$user->assignRole(2);
// or by role name
$user->assignRole('testRole');

使用auzo:user artisan命令管理用户角色分配

# assign role to users
php artisan auzo:user assign '1,2,3' 'SomeRole'
# revoke role from users
php artisan auzo:user revoke '1,2,3' 'SomeRole'

策略

您可以定义自定义条件,我们在这里称之为“策略”,策略是一个自定义函数(您在某个地方创建的),它定义了一些必须满足的条件,才能授予用户权限。

示例:如果用户是帖子的所有者,则授予用户权限。

// App\Post
public function owner($ability, $role, $user, $model) {
    return $user->id == $model->usr_id;
}

有关更多示例,请参阅src/Services/AccessPolicies.php

通过AuzoPolicy Facade管理策略

$policy = AuzoPolicy::create([
    'name'   => 'Post Owner',
    'method' => 'App\Post@owner',
]);

使用auzo:policy artisan命令管理策略

# create new policy
php artisan auzo:policy create --name='Test Policy' --method='Controller@policy'
# delete policy by id
php artisan auzo:policy delete --id=1

权限

将权限赋予角色的能力

// by ability instance
$role->givePermissionTo($ability);
// or by ability id
$role->givePermissionTo(3);
// or by array of abilities ids
$role->givePermissionTo([1,3]);
// or by ability name
$role->givePermissionTo('ability.name');
// remove permission by passing ability name
$role->removePermissionTo('ability.name');

将策略限制的能力赋予角色

$role->givePermissionTo($ability->name)
    ->addPolicy($policy1)
    ->addPolicy([$policy2->id => ['operator' => 'or']]);

使用auzo:permission artisan命令管理权限

php artisan auzo:permission give 'testRole' 'ability.test,ability.test2' --policies='1,2:||'

如果应用了多个策略,则默认在策略之间应用“AND”,除非您在将策略添加到权限时指定了运算符。

生成能力

这将使用来自AuzoToolsGenerateAbilities来生成模型及其字段的所有能力(默认匹配路由源方案),并将它们保存到数据库的能力表中。

通过GeneratAbilitiesToDB类

$generator = new Kordy\Auzo\Services\GenerateAbilitiesToDB();
// generate only model CRUD abilities
$generator->modelAbilities($model)->saveModelToDB();
// generate only fields CRUD abilities
$generator->fieldsAbilities($model)->saveFieldsToDB();
// generate both model and fields CRUD abilities
$generator->fullCrudAbilities($model)->saveToDB();

通过artisan命令

php artisan auzo:ability generate 'App\Post'
# or to generate only model abilities
php artisan auzo:ability generate 'App\Post' --option=model
# or to generate only fields abilities
php artisan auzo:ability generate 'App\Post' --option=fields

这将生成并保存以下所有能力到能力表中

[
    [
        'name' => 'post.index',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.create',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.store',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.show',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.edit',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.update',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.destroy',
        'tag'  => 'post',
    ],

    [
        'name' => 'post.index.id',
        'tag'  => 'post.index',
    ],

    [
        'name' => 'post.create.id',
        'tag'  => 'post.create',
    ],

    [
        'name' => 'post.store.id',
        'tag'  => 'post.store',
    ],

    [
        'name' => 'post.show.id',
        'tag'  => 'post.show',
    ],

    [
        'name' => 'post.edit.id',
        'tag'  => 'post.edit',
    ],

    [
        'name' => 'post.update.id',
        'tag'  => 'post.update',
    ],

    [
        'name' => 'post.destroy.id',
        'tag'  => 'post.destroy',
    ],

    [
        'name' => 'post.index.name',
        'tag'  => 'post.index',
    ],

    [
        'name' => 'post.create.name',
        'tag'  => 'post.create',
    ],

    [
        'name' => 'post.store.name',
        'tag'  => 'post.store',
    ],
    ....

致谢

  1. 基于laravel-permission package,如果需要为用户提供多个角色和直接权限,则被认为是此包的最佳替代品。
  2. 感谢我的朋友balping的大力帮助

贡献

有关详细信息,请参阅CONTRIBUTING

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件