Я работаю над приложением mongoose / express, в котором необходимо загрузить документ из базы данных, прежде чем определить, авторизован ли пользователь для выполнения действий с ним.Например, пользователь может иметь права доступа read
для документа, но только если этот документ имеет конкретное значение в своем поле organizations
.Или пользователь может редактировать документ, но только если его идентификатор пользователя находится в массиве assignedTo
в этом документе.
Каковы плюсы и минусы следующих подходов к дизайну в приложении mongoose / express?
A: Авторизация в промежуточном программном обеспечении, несколько раз запрашивает базу данных:
- Аутентификация пользователя в промежуточном программном обеспечении и объект полномочий пользователя извлекаются из объекта сеанса пользователя.
- АвторизацияПромежуточное программное обеспечение запрашивает в базе данных документ, к которому обращается пользователь.На основе объекта полномочий пользователя и значений в документе он определяет, авторизован ли пользователь для выполнения действия.
- Маршрут направляет запрос в контроллер, который загружает документ mongoose, выполняет логику приложения, обновляетв базу данных и отправляет ответ пользователю.
B: Авторизация в промежуточном программном обеспечении, прикрепляет документ к запросу:
- Пользователь проходит проверку подлинности в промежуточном программном обеспечении и пользовательобъект permissions извлекается из объекта сеанса пользователя.
- Middleware загружает документ из базы данных и определяет, авторизован ли пользователь для выполнения действия.Затем промежуточное программное обеспечение присоединяет документ mongoose к запросу.
- Маршрут направляет запрос контроллеру, который выполняет логику приложения и обновляет базу данных, используя документ mongoose, прикрепленный к запросу.
C: Выполнить авторизацию на уровне контроллера / служб:
- Аутентификация пользователя в промежуточном программном обеспечении, и объект разрешений извлекается из объекта сеанса пользователя.
- Маршрут пересылает запроск контроллеру, который загружает документ mongoose из базы данных, проверяет, авторизован ли пользователь для выполнения действия.Если это так, контроллер выполняет логику приложения и обновляет базу данных.
Подход A вписывается в парадигму проектирования промежуточного программного обеспечения, но запрашивает базу данных несколько раз.Недостатки потенциально могут быть смягчены путем индексации коллекций со всеми необходимыми полями для авторизации, чтобы запрос был покрыт .Подход B, кажется, нарушает основной принцип проектирования MVC, передавая модель через запрос.Подход C не имеет ни одного из вышеперечисленных недостатков, но, по-видимому, требует большего количества стандартного кода, записанного на уровне контроллера / служб.
Я знаю, что есть и другие потенциальные подходы, которые я также здесь не рассматривал, особенно если вы разрешаетеза использование других сервисов, таких как кэши Redis.