Как должна выглядеть реализация гибкой системы управления доступом?

Приветствую. У меня есть свое API, и я хочу реализовать достаточно гибкое управление доступом к методам. У меня есть различные типы пользователей (администратор, модератор,...), которые могут динамически создаваться и удаляться, можно редактировать уровень разрешений, который доступен каждому типу пользователя. У каждого типа пользователя есть свой приоритет.
Вот некоторые абстрактные примеры, которые я хочу, чтобы поддерживала система управления доступом:
- модератор может банить пользователей, которые ниже его по приоритету.
- пользователь может редактировать свои сообщения, модератор может редактировать как свои, так и чужие сообщения.
- модератор может удалять сообщения не во всех беседах, а только в заранее выбранных администратором.

Я рассматривал модель управления доступом на основе ролей (RBAC), но она дает мне возможность лишь определять, может ли тип пользователя Х вызывать метод Y. Но этого недостаточно: все могут вызывать метод messages.edit, но все с разными правами — пользователям доступно редактирование своих сообщений, модераторам — любых сообщений. Возможно, можно как-то модифицировать RBAC, чтобы она поддерживала такие вещи?
Читал про управление доступом на основе атрибутов (ABAC), в том числе и на хабре, но, в отличии от RBAC (где вся реализация — это таблицы permissions, roles, roles_permissions, users и users_roles), не совсем понятно, как это реализовать на практике и будет ли это удобно в использовании.

Буду благодарен вам за ваши идеи и рекомендации. Меня интересует именно сама концепция того, как это можно сделать..
  • Вопрос задан
  • 374 просмотра
Пригласить эксперта
Ответы на вопрос 1
JhaoDa
@JhaoDa
LaravelRUS Team
Зависит от того, как вы хотите этим пользоваться. Если некто должен иметь возможность натыкать разрешений-галочек в админке, то это точно RBAC. Если не нужна такая возможность, то ACL/ABAC.
RBAC можно комбинировать, т.е. не просто проверить наличие разрешения, а вызвать некий код, который проверит это разрешение в каком-то контексте. Например, по аналогии с политиками в Laravel.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы