Skip to content

beta-eto-code/access.scope.base

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Установка

composer require beta/access.scope.base

Данный модуль предназначен для организации глобальных (не контекстных) доступов в проекте. Это означает что единственным контекстом для данных прав может быть только пользовательская сессия.

Для организации прав в модуле предусмотрены след. сущности:

  • Интерфейс пространства доступов - представляет из себя программный интерфейс использующий атрибуты AccessScope и AccessFlag.
  • Пространство доступов - экземпляр AccessScope построенный через интерфейс.
  • FlagAccessor - представляет реализацию интерфейса FlagAccessor интерфейс, принимает решение о доступе к флагам в пространстве доступов.
  • Флаг пространства доступов - является константой интерфейса пространства доступов с атрибутом AccessFlag.
  • Результат пространства доступов - экземпляр AccessScopeResult, содержащий в себе описание пространства + результаты с вычисленными доступами (либо на основе контекста пользователя или на основе значения битовой маски).

Пример описания интерфейса пространства доступов:

use Access\Scope\AccessFlag;
use Access\Scope\AccessScope;

#[AccessScope('crud')]
interface CrudAccessLevelInterface
{
    public const SCOPE = 'crud'; // для удобства работы с интерфейсом
    
    #[AccessFlag('Доступ на чтение')]
    public const CAN_READ = 'read';
    #[AccessFlag('Доступ на запись')]
    public const CAN_WRITE = 'write';
    #[AccessFlag('Доступ для обновления')]
    public const CAN_UPDATE = 'update';
    #[AccessFlag('Доступ для удаления')]
    public const CAN_DELETE = 'delete';
}

Пример создания пространства доступов на основе интерфейса:

use Access\Scope\AccessScopeBuildEntity;

$accessScope = AccessScopeBuildEntity::createAccessScope(CrudAccessLevelInterface::class);
$accessScope->getScopeName(); // crud
$accessScope->getAccessFlag('read')->getDescription(); // Доступ на чтение
$accessScope->getAccessFlag('update')->accessValue; // 8
$accessScope->getAccessFlag('delete')->accessValue; // 16
$accessScope->getAccessFlag('delete')->name; // delete

Пример реализации FlagAccessor:

use Access\Scope\Interfaces\FlagAccessorInterface;
use Access\Scope\Interfaces\AccessRecipientInterface;

class FlagAccessorAllowOnlyMainAdmin implements FlagAccessorInterface
{
    public function hasAccess(string $scope, string $flag, ?AccessRecipientInterface $recipient = null): bool
    {
        return $recipient && (int) ($recipient->getRecipientId()) === 1;
    }
}

Пример расчета результата пространства доступов:

use Access\Scope\AccessScopeBuildEntity;

$accessScope = AccessScopeBuildEntity::createAccessScope(CrudAccessLevelInterface::class);
$accessor = new FlagAccessorAllowOnlyMainAdmin();
$adminAccessScopeResult = $accessScope->createScopeResultByAccessor($accessor, $adminUserContext);
$adminAccessScopeResult->getAccessValue(); // 30
$adminAccessScopeResult->hasAccessByFlagName('read'); // true
$adminAccessScopeResult->hasAccessByFlagName('write'); // true
$adminAccessScopeResult->hasAccessByFlagName('update'); // true
$adminAccessScopeResult->hasAccessByValue(8); // true
$adminAccessScopeResult->hasAccessByFlagName('delete'); // true
$adminAccessScopeResult->hasAccessByValue(16); // true
$userAccessScopeResult = $accessScope->createScopeResultByAccessor($accessor, $simpleUserContext);
$userAccessScopeResult->getAccessValue(); // 0
$userAccessScopeResult->hasAccessByFlagName('read'); // false
$userAccessScopeResult->hasAccessByFlagName('write'); // false
$userAccessScopeResult->hasAccessByFlagName('update'); // false
$userAccessScopeResult->hasAccessByValue(8); // false
$userAccessScopeResult->hasAccessByFlagName('delete'); // false
$userAccessScopeResult->hasAccessByValue(16); // false
$resultValue = $accessScope->getAccessFlag('read')->accessValue | $accessScope->getAccessFlag('write')->accessValue;
$otherAccessScopeResult = $accessScope->createScopeResultByAccessValue($resultValue);
$otherAccessScopeResult->getAccessValue(); // 6
$otherAccessScopeResult->hasAccessByFlagName('read'); // true
$otherAccessScopeResult->hasAccessByFlagName('write'); // true
$otherAccessScopeResult->hasAccessByFlagName('update'); // false
$otherAccessScopeResult->hasAccessByValue(8); // false
$otherAccessScopeResult->hasAccessByFlagName('delete'); // false
$otherAccessScopeResult->hasAccessByValue(16); // false

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages