RBAC - Как реализовать контроль доступа для каждого экземпляра? (DDD)
В моем приложении DDD, написанном на javascript (Node.js), я наткнулся на реализацию универсального поддоменов авторизации. Я проверил на моделях авторизации RBAC / ACL, как реализовать это, но у них, похоже, нет разрешений для каждого экземпляра, которые мне нужны.
Насколько я понимаю, у RBAC есть полномочия на основе ролей. Пользователи назначены на роли. Роли являются иерархическими и наследуют разрешения. Роли могут иметь несколько разрешений. Разрешения позволяют выполнять команды на ресурсах.
Но, как определено RBAC, ресурсы являются общими, такими как «Записи», «Комментарий», «Книга» и т. Д. Они не привязаны к конкретному экземпляру (например, «Пост» (id: 9283984)). Например, в RBAC невозможно определить, что редактировать его может только пользователь, создавший публикацию. Кажется невозможным присвоить роль «Администратор» «Пользователю (id: (8290321)») для данного «Поста (id: 2398493)»
Еще сложнее определить роли, которые имеют разрешения на выполнение команд, которые изменяют роли других людей в конкретном ресурсе.
Требования моих приложений:
User
кто выпустилCreateLedger
Команда автоматически назначается какAdmin
этогоLedger
, Он может назначать других людей только какManagers
или жеCollaborators
или жеViewers
из книг онAdmin
из. Он также может отозвать эти роли.Managers
разрешено управлятьAccounts
изLedger
. Collaborators
разрешено редактироватьTransactions
на этомLedger
, а такжеViewers
только возможность просматривать данные (только для чтения).Admin
можно назначитьAdmin
роль в книгах онAdmin
из другогоUser
.
Моя первоначальная идея заключалась в том, что для того, чтобы пользователь мог управлять ролями пользователя на ресурсе, необходимо было бы сопоставить
user(id:X) -> role(name:Z) -> permissions -> resource(id:Y) -> commands
но в RBAC можно только назначить
user(id:X) -> role(name:Z) -> permissions -> resource(name:"Ledger") -> commands
Затем, чтобы преодолеть это ограничение RBAC, я подумал об именовании ресурсов с их идентификаторами, такими как
user(id:X) -> role(name:Z) -> permissions -> resource(name:"Ledger:39823847") -> commands
Но это кажется неправильным. Я не видел ни одного примера RBAC, использующего имена ресурсов в качестве отображения для реальных экземпляров.
Я использую не тот молот? Я вижу это неправильно? Есть ли какая-то другая модель контроля доступа, более подходящая для этой задачи? Или это путь? Буду признателен, если кто-нибудь укажет мне правильное направление.
Спасибо за помощь