gabrielberthier/ravine-rbac

此包最新版本(1.0.0)没有可用的许可信息。

一个提供PSR-15实现中RBAC授权的包

1.0.0 2023-10-26 19:15 UTC

This package is auto-updated.

Last update: 2024-09-27 20:50:40 UTC


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

灵感来源

PHP Simple RBAC Python Simple RBAC 基于角色、属性和条件的Node.js访问控制