PHPackages                             snr/access\_descriptor - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. snr/access\_descriptor

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

snr/access\_descriptor
======================

Описывает доступ

1.0.0(8mo ago)04PHPPHP &gt;=7.3

Since Sep 5Pushed 8mo agoCompare

[ Source](https://github.com/semahinn/access_descriptor)[ Packagist](https://packagist.org/packages/snr/access_descriptor)[ RSS](/packages/snr-access-descriptor/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (5)Versions (3)Used By (0)

Описание
========

[](#описание)

AccessDescriptor это объект, который описывает данные о доступе определённых СУБЪЕКТОВ доступа по разным операциям ('view', 'edit', 'delete' и т.д.) к определённым ОБЪЕКТАМ доступа. Например, субъектами доступа в нашем случае являются пользователи, роли или что то другое, определяющее, КАК именно будет вычисляться доступ.

Установка
---------

[](#установка)

```
composer require snr/access_descriptor
```

Использование
=============

[](#использование)

Все примеры можно найти в файле tests/Test.php

1. По-умолчанию все обработчики доступа описываются в папке Plugin/AccessDescriptorHandler. Это можно переопределить, создав свой "Менеджер обработчиков", который должен реализовывать HandlerPluginManagerInterface. Хорошим решением будет унаследоваться от класса HandlerPluginManager.

```
class TestHandlerPluginManager extends HandlerPluginManager
{
   public function __construct(array $namespaces, EventDispatcherInterface $event_dispatcher)
   {
     parent::__construct($namespaces, $event_dispatcher);
     $this->subdir = "Dir\\SubDir";
   }
}
```

2. Вы должны зарегистрировать "Менеджер обработчиков" у себя в контейнере. В тестовом примере Test.php показывается как это сделать. Так, я использую класс HandlerPluginManager, т.к. меня устраивает стандартное поведение.

```
$container->register(HandlerPluginManager::class, HandlerPluginManager::class)
  // Вместо Snr\AccessDescriptor\Tests укажите пространство имён вашего проекта,
  // Вместо $root/tests - соответстующую директорию
  ->addArgument(["Snr\AccessDescriptor\Tests" => "$root/tests"])
  ->addArgument(new Reference('event_dispatcher'));
```

3. Обрботчики доступа хранятся в папке, указанной в HandlerPluginManager (в нашем случае это Plugin/AccessDescriptorHandler). Чтобы описать один из них, необходимо создать класс, наследующий базовый HandlerPlugin. В примере ниже мы описали обработчик с логикой вычисления доступа для субъекта 'users' (Пользователи).

```
/**
 * @AccessDescriptorHandler(
 *   id = "users",
 *   label = "Пользователи",
 *   description = "Пользователи",
 *   subjects = {
 *     "users",
 *   },
 * )
 */
class Users extends HandlerPlugin {

  /**
   * {@inheritdoc}
   */
  public function access(AccessDescriptorInterface $access_descriptor, $account, string $operation = 'all') {
    // ...
  }

  /**
   * {@inheritdoc}
   */
  public function getPluginManager() {
    // Должен возвращать экземпляр HandlerPluginManagerInterface из вашего контейнера
  }
}
```

4. Один обработчик может описывать логику доступа сразу для нескольких субъектов.

```
/**
 * @AccessDescriptorHandler(
 *   id = "users_or_roles",
 *   label = "Пользователи и роли",
 *   description = "Пользователи и роли",
 *   subjects = {
 *     "users",
 *     "roles",
 *   },
 * )
 */
class UsersOrRoles extends HandlerPlugin
{
  /**
   * {@inheritdoc}
   */
  public function access(AccessDescriptorInterface $access_descriptor, $account, string $operation = 'all') {
    // ...
    return new AccessResultNeutral();
  }

  /**
   * {@inheritdoc}
   */
  public function getPluginManager() {
    // Должен возвращать экземпляр HandlerPluginManagerInterface из вашего контейнера
  }
}
```

4. Теперь мы может создавать экземпляры AccessDescriptor для вычисления значения доступа. Здесь написано, что он работает с субъектами 'users' и 'roles'. Т.е. для этих субъектов обязательно должны быть описаны обработчики (как в примерах выше).

```
    // Например, мы хотим описать доступ по 'Ролям' и 'Пользователям' к какой либо записи
    // Мы может сразу воспользоваться классом AccessDescriptor и создать его экземпляр
    // Под капотом он сам определит набор обработчиков, которые будет использовать
    $access_descriptor = new AccessDescriptor(['users', 'roles']);

    // Дадим доступ пользователям с идентификаторами 1 и 5 и всем
    // пользователям с ролью "Работник" ('employee')
    $access_descriptor->addAccess(['1', '5'], 'users');
    $access_descriptor->addAccess(['employee'], 'roles');

    // Получим значение, которое можно куда то сохранить
    $access_value = $access_descriptor->__toString();

    // ...

    // Создадим экземпляр AccessDescriptor из сохранённых значений
    $access_descriptor = new AccessDescriptor(['users', 'roles'], $access_value);
```

5. Вызвав метод access у экземпляра AccessDescriptor мы запускаем выполение логики во всех обработчиках. Если в определении доступа участвует несколько обработчиков, то их результаты объединяются с помощью логического ИЛИ.

```
    // Теперь для пользователя 'Dave' мы проверим его доступ к записи
    $access_result = $access_descriptor->access(User::dave());
```

6. Если мы попытаемся создать AccessDescriptor для недопустимого набора обработчков, а потом проверим доступ, то произойдёт исключение (обработчика для субъекта 'abdc' не существует).

```
    // Если мы попытаемся создать AccessDescriptor для недопустимого набора обработчков,
    // а потом проверим доступ, то произойдёт исключение (обработчика для субъекта 'abdc' не существует)
    try {
      $access_descriptor = new AccessDescriptor(['users', 'abdc']);
      $access_descriptor->access(User::dave());
    } catch (\Exception $ex) {
      $message = $ex->getMessage();
    }
```

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance60

Regular maintenance activity

Popularity3

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity32

Early-stage or recently created project

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

252d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/7efda00f5df57e9f68d68a1b781c71a9b4b11c274592d91844689020a19fb4bd?d=identicon)[snr](/maintainers/snr)

---

Top Contributors

[![semahinn](https://avatars.githubusercontent.com/u/62962326?v=4)](https://github.com/semahinn "semahinn (2 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/snr-access-descriptor/health.svg)

```
[![Health](https://phpackages.com/badges/snr-access-descriptor/health.svg)](https://phpackages.com/packages/snr-access-descriptor)
```

###  Alternatives

[symfony/security-bundle

Provides a tight integration of the Security component into the Symfony full-stack framework

2.5k172.9M1.8k](/packages/symfony-security-bundle)[gesdinet/jwt-refresh-token-bundle

Implements a refresh token system over Json Web Tokens in Symfony

70516.4M35](/packages/gesdinet-jwt-refresh-token-bundle)[scheb/2fa

Two-factor authentication for Symfony applications (please use scheb/2fa-bundle to install)

578630.7k1](/packages/scheb-2fa)[sonata-project/user-bundle

Symfony SonataUserBundle

3465.6M44](/packages/sonata-project-user-bundle)[scheb/2fa-bundle

A generic interface to implement two-factor authentication in Symfony applications

6914.0M62](/packages/scheb-2fa-bundle)[ezsystems/ezplatform-user

eZ Platform User bundle

24709.4k16](/packages/ezsystems-ezplatform-user)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
