Многие системы RBAC для REST используются для защиты конечной точки API, например /students
или /invoice/list
, но как эффективно защитить конкретные объекты, такие как /students/pete
и /invoice/123
?Насколько я понимаю, система работает следующим образом:
Groups
являются коллекциями Users
Roles
являются коллекциями Permissions
Groups
и Roles
связаны сm:n
отношение.Разрешение защищает только конечную точку /students
и ничего больше.Таким образом, мы можем назначить один Role
нескольким пользователям (Groups
), не создавая один и тот же экземпляр этой роли снова и снова, потому что кто-то может получить доступ к одному экземпляру больше, чем к другому.В противном случае количество разрешений и ролей могло бы быстро взорваться, что не вариант, потому что в моей системе роли иерархические и их хранение уже стоит дорого.
Я думал использовать таблицу пересечений между Groups
, а также хранитьid
экземпляра, который должен быть защищен Roles
, поэтому нам нужно создать ссылку между Groups
и Resources
для каждого учащегося, которого может просматривать человек.Это также может быть расширено до даты, после которой правило истекает, или других полезных свойств.
Тем не менее, мои внутренности говорят мне, что это плохой подход, потому что эти явные ссылки на ресурсы не относятся к новым студентам (очевидно) и нам придется обновлять таблицу каждый раз, когда в систему вводится студент.
Вопрос здесь заключается в том, есть ли лучший способ реализовать RBAC для защиты конкретных экземпляров за этими конечными точками?Мне известно об ABAC, но я хочу разрешить своим пользователям добавлять свои собственные группы и предоставлять общий доступ к данным, для чего мне нужно эффективное представление базы данных.