imarc / auth
基于角色的访问控制(RBAC)和访问控制列表(ACLs)
2.0-beta20
2023-10-20 04:04 UTC
Requires
- php: >=7.2
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^8.5
- psr/http-factory: ^1.0
- psr/http-server-middleware: ^1.0
This package is auto-updated.
Last update: 2024-09-20 05:59:14 UTC
README
本项目将更传统的RBAC方法与以用户为中心的动态覆盖相结合,达到良好的平衡。它允许您定义基于角色的访问控制列表,以及创建实体或模型级别的实例覆盖和复杂检查的动态逻辑。
ACLs
创建ACL
$acl = new Auth\ACL();
添加角色访问
- 第一个参数是角色的名称(不区分大小写)
- 第二个参数是对象类或字符串(不区分大小写)
- 第三个参数是允许的操作数组
$acl->allow('Admin', 'User', ['create', 'read', 'update', 'delete']);
别名访问
$acl->alias('manage', ['create', 'read', 'update', 'delete']);
使用别名添加
$acl->allow('Admin', 'Article', ['manage']);
授权管理器
您可以为您的授权用户创建一个授权管理器。传递给构造函数的对象必须实现 Auth\EntityInterface
,它包含两个方法
- getRoles() - 返回对象/实体包含的所有角色的数组
- getPermissions() - 返回用户特定的ACLs,这些ACLs会覆盖角色
创建管理器
$manager = new Auth\Manager($user);
添加ACL
$manager->add($acl)
检查受管实体的角色
$manager->is('Admin');
检查受管实体的有效权限
$manager->can('create', 'Article');
或者使用匹配的类对象
$manager->can('create', $article);
检查实现AuthInterface的实体
AuthInterface
提供了一种方式,实体可以提供自定义逻辑来授权受管实体对自己进行授权。使用前面的示例
$manager->can('create', $article);
如果 $article
参数是一个实现 AuthInterface
的对象,则管理器将调用它的 can()
方法,将管理器实例作为第一个参数传递,并将正在检查的权限作为第二个参数。然后文章可以执行以下操作
public function can(Manager $manager, $permission) { if ($manager->has($permission, $this)) { return TRUE; } return $manager->entity == $this->getOwner(); }
在此示例中,实体检查其所有者是否为受管实体,以提供对任何其他未授予的操作的权限。
代码检查和测试
运行分析
php vendor/bin/phpstan -l7 analyse src/
运行测试
php vendor/bin/phpunit --bootstrap vendor/autoload.php test/cases