Alexya的角色基于访问系统工具

3.0.0 2017-06-05 13:48 UTC

This package is not auto-updated.

Last update: 2024-09-15 02:43:20 UTC


README

Alexya的角色基于访问系统工具。

内容

创建权限

权限是授权用户执行特定操作的方式。

\Alexya\Roles\Permission代表可以分配给特定角色的权限。

权限由一个标识符、一个标题和一个状态标志组成。

您可以轻松扩展此类以提供更多功能,例如替代名称、等级...

例如,在文件系统中,每个用户都应该有读取/写入某些文件的权限

<?php
namespace Application\RBAC\Permissions;

use Alexya\Roles\Permission;

class Read extends Permission
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct(1, "read", Permission::STATUS_INHERITED);
    }
}

class Write extends Permission
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct(2, "write", Permission::STATUS_INHERITED);
    }
}

创建角色

角色是各种权限的容器。

\Alexya\Roles\Role代表一个角色本身。

它有一个角色的标识符、一个标题和一个包含此角色授予权限的Permission数组。或者,一个角色可以有一个父角色以实现继承。

它还有一个表示角色优先级的整数,数字越大,优先级越高。

方法hasPermission接受一个权限的标识符或权限的实例,并检查该角色是否已授予该权限。

为了更简洁的版本,您可以使用can,因为短于长。

示例

namespace Application\RBAC\Roles;

use Alexya\Roles\Role;

class CanRead extends Role
{
    /**
     * Constructor
     */
    public function __construct()
    {
        parent::__construct(1, "can_read", 1);
    }
}

class CanWrite extends Role
{
    /**
     * Constructor
     */
    public function __construct()
    {
        parent::__construct(2, "can_write", 1);
    }
}

class CanReadAndWrite extends Role
{
    /**
     * Constructor.
     */
    public function __construct()
    {
        parent::__construct(3, "can_read_and_write", 2);
    }
}

将权限添加到角色

一旦您有了所需的权限和角色,您需要指定哪些角色被授予哪些权限。

权限可以是启用的、禁用的或继承的。如果权限被继承,则角色将检查父角色中该权限的状态,如果没有父角色,则将其视为禁用。

将权限添加到角色与调用带有要添加的权限的addPermission方法一样简单。

示例

$canRead = new CanRead();
$canRead->addPermission(new Read());

$canWrite = new CanWrite();
$canWrite->addPermission(new Write());

$canReadAndWrite = new CanReadAndWrite();
$canReadAndWrite->addPermission(new Read());
$canReadAndWrite->addPermission(new Write());

// Alternatively you could have set the parent role like this:
// $canReadAndWrite = new CanReadAndWrite();
// $canReadAndWrite->parent = $canRead;
// $canReadAndWrite->addPermission(new Write());

要检查角色是否已授予特定权限,您可以使用hasPermissioncan方法

$canRead->can("read"); // true
$canRead->can(2); // false (Write permission has ID 2)
$canRead->can(new Read()); // true

方法getPermission从角色返回一个权限

$read  = $canRead->getPermission(new Read()); // The Read permission sent through `addPermission`
$write = $canRead->getPermission("write");    // null;

创建用户

现在我们有了角色和权限,我们需要用户来分配它们。

\Alexya\Roles\User代表一个用户,其中分配了角色。

这是您应该扩展以将角色添加到您的用户的类,因为它提供了用于检查此用户是否被授予任何权限的hasPermissioncan方法。

它还具有添加/删除角色的addRoleremoveRole方法。

示例

$user = new User();

$user->addRole(2);

$user->can(new Read());  // false
$user->can(new Write()); // true

$user->addRole(new CanRead());

$user->can("read");  // true
$user->can(new Write()); // true

$user->getRole("can_write")
     ->getPermission("write")
     ->status = Permission::STATUS_DISABLED;

$user->can(new Read());  // true
$user->can(new Write()); // false

$user->addRole(new CanReadAndWrite());

$user->can(new Read());  // true
$user->can(new Write()); // true because the priority of `CanReadAndWrite` is bigger than the `CanWrite` priority.