Единый 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
теперь не зацеплены между собой.