Skip to main content

Вдохновлено ABAC и XAML

Описанный паттерн берет за основу принципы ABAC (Attribute-Based Access Control) и XAML.

На клиенте нужен ABAC, даже если на бэкенде RBAC

В этой статье вы можете прочитать чем концептуально отличаются ABAC (Attribute-Based Access Control) и RBAC (Role Based Access Control).

На Frontend'е нужна такая система доступов, которая однозначно будет указывать на предмет блокировок доступов в контексте пользовательского интерфейса. RBAC и даже ABAC, имплементированный на стороне API не будет зависеть от UI, который привносит свою дополнительную специфичность при расчете доступов.

В связи с этим, на клиенте необходимо перманентно использовать ABAC, доступы которого будут напрямую связаны со специфичностью UI.

Пример с RBAC на бэкенде

Предметная область

ЭДО

Роли

  • PaymentAccount
  • FreeAccount

Бизнес требование

Кнопка "Создать документ" доступна для пользователя с платным аккаунтом и если у него есть созданная организация.

Проблема

Из требования видно, что для вычисления доступа не хватает только одного знания о роле пользователя (роль PaymentAccount), необходимо дополнительно учитывать есть у пользователя организация.

Неверное решение

Добавить к кнопке дополнительный if на проверку организации. Это приведет к "размазыванию" логики доступов по приложению и последующую потерю контроля.

Правильное решение

Использование ABAC с permission docActions, который внутри будет проверять роль пользователя и наличие организации. docActions будет использоваться в необходимых частях приложения для проверки доступа к действиям на документом.

Пример с ABAC на бэкенде

Предметная область

ЭДО

Permissions с API

  • docActions

Бизнес требование

Кнопка "Создать документ" доступна для пользователя с платным аккаунтом и если он прошел двух факторную аутентификацию.

Проблема

В docActions на бэкенде проверяется оплачен ли аккаунт пользователя, но проверку на 2FA можно провести только в runtime при нажатии на саму кнопку.

Решение

Добавить в едином клиентском сервисе доступов дополнительную логику для docActions, которая будет проверять 2FA.