imarc/auth

基于角色的访问控制(RBAC)和访问控制列表(ACLs)

2.0-beta20 2023-10-20 04:04 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