Алексая, основанная на роли, утилиты системы доступа.
Разрешения - это способ уполномоченного пользователей выполнять определенные действия.
Класс AlexyaRolesPermission представляет собой разрешение, которое может быть назначено определенной роли.
Разрешение состоит из идентификатора, заголовка и флага статуса.
Вы можете легко расширить этот класс, чтобы обеспечить больше функциональности, таких как альтернативные имена, ряды ...
Например, в файловой системе каждый пользователь должен иметь разрешения на чтение/запись в определенные файлы:
<?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 );
}
}Роли являются контейнерами различных разрешений.
Класс AlexyaRolesRole сам по себе представляет роль.
Он имеет идентификатор для этой роли, титула и множества 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()); Чтобы проверить, предоставила ли роль определенное разрешение, вы можете использовать hasPermission или can Methods:
$ 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; Теперь, когда у нас есть роли и разрешения, нам нужны пользователи, чтобы назначить их.
Класс AlexyaRolesUser представляет пользователя, где присваиваются роли.
Это тот класс, который вы должны расширить, чтобы добавить роли вашим пользователям, поскольку он предоставляет hasPermission и can методы проверки, если у этого пользователя предоставлено какое -либо разрешение.
Он также имеет методы addRole и removeRole , чтобы добавить/удалить роли.
Пример:
$ 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.