Skip to main content

Единый Permissions Module

Вся логика, относящиеся к доступам, должна находится в модуле permissions:

├── modules/
| ├── permissions/
| | ├── domain/
| | | ├── stores/
| | | | ├── PermissionsStore/
| | | | | ├── policies/
| | | | | ├── rules/
| | | | | ├── PermissionsStore.ts
| | | | | └── index.ts
| | | | └── index.ts
| | | ├── types/
| | | ├── enums.ts
| | | └── index.ts
| | ├── features/
| | | ├── routesGuards/
| | | | ├── AdminRouteGuard/
| | | | ├── ReadingBookRouteGuard/
| | | | └── index.ts
| | | └── index.ts
| | └── index.ts
| ├── payment/
| └── layout/

Состав permissions модуля

  • Логика формирования доступов
  • Типы доступных в приложении доступов
  • Причины отказа в доступах
  • Логика блокировки рутов приложения

Причины концентрации логики доступов в одном модуле

  • Контроль доступов приложения в одной точке
  • Расчет доступов, в большинстве случаев, связан с данными, которые необходимо получать из других модулей. Если формировать доступы на уровне конкретного модуля, то возникнет нежелательное зацепление между модулями
  • Доступы, мнимо относящиеся к разным модулям, будут использованы в других модулях, что также породит нежелательное зацепление
  • Правила, позволяющие вычислять доступы, должны быть переиспользованы. Хранение правил в одном модуле позволит избежать зацепления модулей
  • Причины отказа в доступе и логика для расчета доступов должна использоваться между доступами. Не централизованное хранение причин отказа и логики приведен к высокому зацеплению в системе
  • Возможность централизованной подготовки данных для формирования базовых доступов

Пример с нежелательным зацеплением

Требования

  • Кнопка "Добавить документ" доступна только если есть подключенная организация
  • Кнопка "Удалить организацию" доступна только если в рамках данной организации не было создано документов

Решение с зацеплением

Модуль docs реализует доступ docActions, который импортирует логику из модуля organization для проверки данных об организации. Модуль organization реализует доступ deletingOrganization, который импортирует логику из модуля docs для проверки данных о документах.

Получаем циклическую зависимость и зацепление между модулями.

Решение без зацепления

Модуль permissions содержит доступы docActions и deletingOrganization, импортируя логику из модулей docs и organization.

Модуль docs и organization теперь не зацеплены между собой.