dmox / h-rbac
基于原生Laravel的功能。具有回调的层次RBAC。
Requires
- illuminate/support: ~5.1
Requires (Dev)
- phpunit/phpunit: ~4.5
This package is not auto-updated.
Last update: 2024-09-20 19:37:59 UTC
README
基于原生Laravel 5的功能。具有回调的层次RBAC。
在创建自己的项目过程中,我形成了一个关于RBAC所需最小能力的观点。它应该允许
- 角色和权限
- 权限的回调(用于在权限检查中传递参数)
- 权限的继承
- RBAC提供服务的方式
安装
请注意,它仅适用于Laravel 5.1及更高版本。
通过Composer
$ composer require dlnsk/h-rbac
将服务提供者添加到 config/app.php
Dlnsk\HierarchicalRBAC\HRBACServiceProvider::class,
发布一些有趣的内容
- 配置文件(config/h-rbac.php)
- 迁移(向
users表添加role字段) - 角色/权限/回调配置类(app/Classes/Authorization/AuthorizationClass.php)
使用
php artisan vendor:publish --provider="Dlnsk\HierarchicalRBAC\HRBACServiceProvider"
添加您需要的角色、权限以及需要的地方的回调,享受乐趣!
概述
此模块是Laravel 5.1及更高版本的授权逻辑的包装器,用于控制对资源访问。除了您不应该定义能力,它们将自动定义。
让我们描述一下RBAC所需的最小能力(据我所知)。
角色和权限
很明显。
权限的回调
一个非常常见的情况是允许用户仅更改自己的帖子。使用这个包很简单
public function editOwnPost($user, $post) { return $user->id === $post->user_id; }
并且使用
if (\Gate::can('editOwnPost', $post)) { }
您可以在回调中传递任意数量的参数作为数组。
权限的继承
如您所见,回调非常有用。但网站管理员可以编辑任何帖子怎么办?创建单独的权限?但我们应该检查哪一个呢?
答案是使用链式(继承)权限。例如
editPost -> editPostInCategory -> editOwnPost
将这些权限中的每一个放入适当的角色中,但我们始终检查第一个(除非在非常罕见的情况下)
if (\Gate::can('editPost', $post)) { }
这些权限将逐一检查,直到其中一个通过。否则,将拒绝用户的权限。因此,我们有许多具有不同业务逻辑的权限,但在代码中只需检查一个。
RBAC提供的方式
非常流行的是使用数据库存储角色和权限。它很灵活,但很难支持。角色和权限的管理需要后端(但仍可以直接在DB中更改)。当我们开始使用权限的继承时,直接更改变得过于困难。
在另一方面,大多数项目都不大。它们只需要少量角色和权限,因此后端变得经济上不划算。因此,我相信文件驱动的RBAC对许多项目来说已经足够。它是可视的,且易于支持。
角色和权限的存储在逻辑的另一层,因此可以在以后添加数据库支持。
用法
正如我所说,h-rbac是Laravel 5.1及更高版本的授权逻辑的包装器。因此,您可以使用它的任何功能。
if (\Gate::allows('editPost', $post)) { // do something } ... if (\Gate::denies('editPost', $post)) { abort(403); } ... if (\Gate::forUser($user)->allows('editPost', $post)) { // do something }
从用户模型
if ($request->user()->can('editPost', $post)) { // do something } ... if ($request->user()->cannot('editPost', $post)) { abort(403); }
在控制器中
$this->authorize('editPost', $post);
在Blade中
@can('editPost', $post)
<!-- The Current User Can Update The Post -->
@else
<!-- The Current User Can't Update The Post -->
@endcan
此外,在h-rbac中,我们添加了指令@role,您可以将其与@else一起使用
@role('user|manager')
<!-- The current user has any role -->
@endrole
配置
当您使用 artisan 发布配置时,您将拥有配置类 app/Classes/Authorization/AuthorizationClass.php,您应该在其中定义权限、角色和回调。您可以将此文件移动到任何您想要的位置。不要忘记在这种情况下更新 config/h-rbac.php。
配置类的结构
<?php namespace App\Classes\Authorization; use Dlnsk\HierarchicalRBAC\Authorization; class AuthorizationClass extends Authorization { public function getPermissions() { return [ 'editPost' => [ 'description' => 'Edit any posts', // optional property 'next' => 'editOwnPost', // used for making chain (hierarchy) of permissions ], 'editOwnPost' => [ 'description' => 'Edit own post', ], 'deletePost' => [ 'description' => 'Delete any posts', ], ]; } public function getRoles() { return [ 'manager' => [ 'editPost', 'deletePost', ], 'user' => [ 'editOwnPost', ], ]; } ////////////// Callbacks /////////////// public function editOwnPost($user, $post) { $post = $this->getModel(\App\Post::class, $post); // helper method for geting model return $user->id === $post->user_id; } }
只有当您需要对此权限进行额外检查时,才应添加回调。 回调的名称应与权限的驼峰命名相同。
我们使用以下逻辑来检查权限:从当前权限开始,我们逐个检查以下链中的所有内容
- 允许 如果角色具有没有回调的权限
- 允许 如果角色具有权限且回调返回 true
- 拒绝 如果角色链中没有任何权限
- 拒绝 如果角色具有权限但回调返回 false(在这种情况下,我们不检查链中的任何剩余权限)
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CONDUCT
鸣谢
许可
MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件