基于角色的访问控制列表和权限。

2.0.0 2016-09-11 23:48 UTC

This package is not auto-updated.

Last update: 2024-09-28 17:07:24 UTC


README

A simple Role based Access Control List build on Zend Framework 2 ACL.

简介

Northern\Acl 是一个基于角色的访问控制列表,允许轻松定义特定角色的权限。角色可以继承自其他角色。只需将角色与用户关联起来,使用该角色就可以测试该角色是否被允许访问某些访问条件。

安装

要使用 Northern\Acl,请使用 Composer 将其添加到您的项目中

"northern/acl": "1.*"

用法

要使用 Northern\Acl,首先定义一个权限列表。我们可以从一个空列表开始

$permissions = [
   'roles'     => [],
   'resources' => [],
   'rules'     => [],
];

我们的权限列表包含三个顶级要求,rolesresourcesrules。基于角色的访问控制列表的思路是,特定的角色可以通过指定的规则访问资源。不要混淆您在此列表中定义的元素与您应用程序中的“真实”对象。权限列表只是一个结构(或模型),我们对其进行测试,它是静态的,因此它不需要存储在数据库中,而可以简单地作为您的业务规则的一部分定义在您应用程序的业务对象中。

让我们添加一些权限..

为了演示的目的,我们定义了四个角色:guestmemberauthoradmin。为了辩论的目的,我们定义了一个简单博客的资源,所以有 postcomment 作为资源

$permissions = [
   'roles'     => [
      ['name' => 'guest'],
      ['name' => 'member', 'parent' => 'guest'],
      ['name' => 'author', 'parent' => 'member'],
      ['name' => 'admin',  'parent' => 'author'],
   ],
   'resources' => [
      ['name' => 'post'],
      ['name' => 'comment'],
   ],
   'rules'     => [],
];

很简单。现在让我们定义一个规则,允许访客查看文章和评论

$permissions = [
   'roles'     => [
      ['name' => 'guest'],
      ['name' => 'member', 'parent' => 'guest'],
      ['name' => 'author', 'parent' => 'member'],
      ['name' => 'admin',  'parent' => 'author'],
   ],
   'resources' => [
      ['name' => 'post'],
      ['name' => 'comment'],
   ],
   'rules'     => [
      [
         'access'      => 'allow',
         'role'        => 'guest',
         'permissions' => ['view'],
         'resources'   => ['post', 'comment'],
      ]
   ],
];

如您所见,规则非常简单。permissionsresources 可以设置为单个值或数组。让我们创建一个规则,允许成员创建评论

$permissions = [
   'roles'     => [
      ['name' => 'guest'],
      ['name' => 'member', 'parent' => 'guest'],
      ['name' => 'author', 'parent' => 'member'],
      ['name' => 'admin',  'parent' => 'author'],
   ],
   'resources' => [
      ['name' => 'post'],
      ['name' => 'comment'],
   ],
   'rules'     => [
      [
         'access'      => 'allow',
         'role'        => 'guest',
         'permissions' => ['view'],
         'resources'   => ['post', 'comment'],
      ], [
         'access'      => 'allow',
         'role'        => 'member',
         'permissions' => ['create'],
         'resources'   => ['comment'],
      ]
   ],
];

太好了。现在让我们填写其余的权限

$permissions = [
   'roles'     => [
      ['name' => 'guest'],
      ['name' => 'member', 'parent' => 'guest'],
      ['name' => 'author', 'parent' => 'member'],
      ['name' => 'admin',  'parent' => 'author'],
   ],
   'resources' => [
      ['name' => 'post'],
      ['name' => 'comment'],
   ],
   'rules'     => [
      [
         'access'      => 'allow',
         'role'        => 'guest',
         'permissions' => ['view'],
         'resources'   => ['post', 'comment'],
      ], [
         'access'      => 'allow',
         'role'        => 'member',
         'permissions' => ['create'],
         'resources'   => ['comment'],
      ], [
         'access'      => 'allow',
         'role'        => 'author',
         'permissions' => ['create', 'edit', 'delete'],
         'resources'   => ['post'],
      ], [
         'access'      => 'allow',
         'role'        => 'admin',
         'permissions' => NULL,
         'resources'   => NULL,
      ]
   ],
];

我们添加了作者权限并将管理员权限设置为允许所有资源上的所有访问。

要使用这些权限,我们需要将它们加载到 ACL 中,如下所示

$acl = new \Northern\Acl\Acl();
$acl->loadPermissions( $permissions );

$acl 实例将允许我们通过 isAllowed 方法测试权限。然而,Northern\Acl 的真正力量在于需要创建子类的 Permissions 类。

class Permissions extends \Northern\Acl\Permissions {

    public function getRoles()
    {
       return ['guest', 'member', 'author', 'admin'];
    }

    public function getResources()
    {
       return ['post', 'comment'];
    }

    public function getRules()
    {
    	  return ['create', 'view', 'edit', 'delete'];
    }

}

现在我们可以使用这个 Permissions 类来做一些魔法

$acl = new \Northern\Acl\Acl();
$acl->loadPermissions( $permissions );

$authorPermissions = new Permissions( $acl, 'author' );

$authorPermissions->canCreatePost();
// TRUE!

如您所见,Permissions 实例允许您通过魔法方法测试角色的权限。

这就是全部了!