gabrielberthier / ravine-rbac
一个提供PSR-15实现中RBAC授权的包
Requires
- php: ^8.2
- ext-json: *
- cycle/annotated: ^3.2
- cycle/entity-behavior-uuid: ^1.1
- cycle/migrations: ^4.1
- cycle/orm: ^2.3
- doctrine/dbal: ^3.6
- doctrine/migrations: ^3.6
- doctrine/orm: ^2.15.0
- firebase/php-jwt: ^6.0
- httpsoft/http-server-request: ^1.1
- monolog/monolog: >=3.4
- nyholm/psr7: ^1.8
- phpoption/phpoption: ^1.9
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- symfony/cache: ^6.0
- symfony/dotenv: ^6.0
- symfony/yaml: ^6.0
Requires (Dev)
- phpspec/prophecy: dev-master
- phpunit/phpunit: ^10
- rector/rector: ^0.17.5
- squizlabs/php_codesniffer: ^3.6
- symfony/var-dumper: ^6.3
- vimeo/psalm: ^5.15
README
A PHP RBAC implementation using PSR-15, PSR-7 and preconfigured examples using ORMs for running either in long or short-lived processes.
这个包是如何工作的?
在示例文件夹中,您应该能一瞥如何使用这个库,但为了总结,您应该将RBAC验证中间件的实例添加到您的PSR-15堆栈中,并在请求对象的属性中附加以下格式的数组
$values = [ 'data' => [ 'email' => 'mail', // optional (future work using accounts with many roles) 'username' => 'username', // optional (future work using accounts with many roles) 'role' => 'admin' // -> MANDATORY ] ]; # It could be sent in JSON string format as well $values = '{"data":{"email":"mail","username":"username","role":"admin"}}';
然后使用中间件如下
$accessControl = new AccessControl(); $factory = new RbacValidationFactory($accessControl); $factory('resource name')->process($request, $handler);
然后,中间件将HTTP方法映射到所需的操作(读取、更新、删除)。您也可以自定义这些操作。
这个包注重真正可扩展,这意味着您可能会在许多其他场景中使用它,而不仅仅是上面的或complex-example
目录中的场景。您可以使用预定义的事件将指定的角色存储到数据库中(您必须使用ProxyAccessControl来完成此操作),实现自己的仓库层,根据意愿扩展角色,等等。我故意提供了一个仓库层,以便使用Cycle ORM来实现磁盘存储,这足以给您一个关于如何个性化自己的仓库层的想法。
更复杂的功能包括
- 事件监听器
use RavineRbac/Domain/Events/Events/{ OnRoleRevokedEvent, OnRoleExtendedEvent, OnRoleAppendedEvent, OnRoleCreateEvent, OnResourceCreateEvent, OnRbacStart, OnResourceAppendedEvent, OnAccessAttempt, OnPermissionAdded }; $provider = new ListenerProvider(); $provider->addListener(OnRbacStart::class, fn(OnRbacStart $event) => echo "Make what you want to"); /** @var Middleware */ $middleware = new RoleValidationMiddleware( resource: 'image', accessControl: new ProxyAccessControl( new AccessControl(), new EventDispatcher($provider), $logger ) );
- 自定义回退
$roleValidationMiddleware->setByPassFallback(new class () implements RbacFallbackInterface { public function retry( Role|string $role, ResourceType|string $resource, ContextIntent|Permission $permission ): bool { return $role->name === 'you know who'; } });
- 默认权限名称
$roleValidationMiddleware->setPredefinedPermission(new Permission('file requests', ContextIntent::CUSTOM));
- 以及您
什么是RBAC
基于角色的访问控制(RBAC)是指根据用户在组织中的角色分配权限的理念。它提供了一种简单、易于管理的访问管理方法,比逐个分配权限更不容易出错。
当使用RBAC进行角色管理时,您会分析用户的需求,并根据共同责任将他们分组到角色中。然后,您将一个或多个角色分配给每个用户,并将一个或多个权限分配给每个角色。用户-角色和角色-权限关系使得用户分配变得简单,因为用户不再需要逐个管理,而是拥有符合其角色(们)分配的权限的特权。
例如,如果您使用RBAC来控制HR应用程序的访问权限,您可以给HR经理分配一个角色,允许他们更新员工信息,而其他员工只能查看他们自己的信息。
在规划您的访问控制策略时,最佳实践是分配给用户最少的权限,以便他们完成工作。
规则
所有RBAC模型都必须遵守以下规则
- 角色分配:只有当主体被分配角色时,主体才能行使权限。
- 角色授权:系统必须授权主体的活动角色。
- 权限授权:主体只能应用授予其活动角色的权限。
RBAC模型
RBAC标准中有三种访问控制类型:核心、层次和限制。我选择专注于前两种。
域
角色是一组用户权限的集合。角色与传统组不同,组是一组用户的集合。在RBAC的上下文中,权限不是直接与身份相关联,而是与角色相关联。角色比组更可靠,因为它们是围绕访问管理组织的。在一个典型的组织中,功能和活动的变化频率低于身份。
想法
一个主题(即人、系统、程序)具有一个或多个角色。角色不能互斥。主题想要访问特定的资源,但该资源必须在主题拥有相应的权限集合的情况下才能访问。权限可以关联意图,例如创建、读取、更新或删除。
参考
https://frontegg.com/guides/rbac https://auth0.com/docs/manage-users/access-control