kordy / auzo
Laravel 授权的中央管理界面
Requires
- kordy/auzo-tools: ~1.0
- laravel/framework: ^5.1
Requires (Dev)
- doctrine/dbal: ^2.5
- orchestra/testbench: ^3.1
- phpunit/phpunit: ^4.0|^5.0
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 授权管理的工具。
此包可以做什么
安装
您可以通过 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”,除非您在将策略添加到权限时指定了运算符。
生成能力
这将使用来自AuzoTools的GenerateAbilities
来生成模型及其字段的所有能力(默认匹配路由源方案),并将它们保存到数据库的能力表中。
通过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', ], ....
致谢
- 基于laravel-permission package,如果需要为用户提供多个角色和直接权限,则被认为是此包的最佳替代品。
- 感谢我的朋友balping的大力帮助
贡献
有关详细信息,请参阅CONTRIBUTING。
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。