beta / access.scope.base
Installs: 0
Dependents: 1
Suggesters: 0
Security: 0
Stars: 0
Watchers: 2
Forks: 0
Open Issues: 0
Type:lib
Requires
- php: >=8.0
- beta/model.base: ^1.0
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2025-03-05 07:47:40 UTC
README
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