Я не знаю, является ли это «лучшей практикой», но вот как я к ней подхожу:
- Мои конечные точки REST API позволяют мне точно знать, что пытается сделать вызывающая сторона.
- Мое управление сеансом (например, JWT и связанные пользовательские данные) управляется на уровне REST API. Когда приходит запрос, я загружаю данные пользователя и компании для этого пользователя. Это предполагает, что JWT не сохраняет права доступа - только идентификаторы пользователей. Это позволяет изменять права доступа в течение всего срока службы JWT. Полезно для долгоживущих токенов, используемых в некоторых приложениях.
- Учитывая (1) и (2), код может определить, есть ли у пользователя права на выполнение запроса.
Как только код проходит этап (3), он больше не беспокоится о правах доступа. На самом деле, нижние уровни кода не нуждаются в логике прав доступа.
Да, в некоторых случаях код должен пройти вверх по дереву из целевой таблицы / строки, чтобы узнать, кому он принадлежал. Для этого я рекомендую настраиваемые запросы, поэтому вам нужно всего лишь один раз обратиться к базе данных, чтобы определить владельца. "Есть ли у компании / пользователя собственная запись X?" И если приложение обрабатывает базу данных вокруг этого запроса, вы всегда можете кэшировать ответ локально. Или добавьте столбец компании / идентификатора пользователя.
Обратите внимание, что добавление столбца id компании не нарушает реляционные свойства базы данных. Это может «нормализовать» это, конечно. Но это только один из компромиссов, которые мы делаем как разработчики, чтобы получить требуемую производительность. Я бы не стал париться, если бы это было лучшее решение, учитывая вашу модель данных.
Что касается отношений «многие ко многим», я бы предположил, что если бы у пользователя был доступ к одному элементу, остальные ссылки, на которые он ссылается, принадлежали одному и тому же пользователю / компании, или это не те вещи, которые этот код изменил бы в данном случае. вызов. Конечно, я не знаю ваше заявление, но по моему опыту это имеет тенденцию быть правдой. Таким образом, должна применяться одна проверка доступа.