Аутентификация и авторизация - две разные вещи и должны рассматриваться отдельно. Аутентификация говорит "кто ты?" и авторизация говорит "у вас есть разрешение?" Учитывая, что Express разработан исключительно для промежуточного программного обеспечения, я бы сделал следующее.
- Абстрагируйте вашу аутентификацию в единый промежуточный компонент, который будет работать для всех ваших конечных точек, используя
app.use()
перед монтированием маршрутизатора / маршрутов.
- Создайте функцию авторизации, которую можно вызывать из любого места, она принимает пользователя (или идентификатор или что-то еще у вас) и роль, а затем проверяет, есть ли у пользователя эта роль.
Думайте об этом так, ваша авторизация никогда не изменится, она является основой вашего приложения. Если вы решили отказаться от Expressjs и использовать Koa или перейти от традиционных HTTP-запросов к веб-сокетам, вы не захотите менять логику авторизации. Но ваша аутентификация может измениться, вы можете больше не использовать заголовок для хранения токена, возможно, вы переключаетесь на куки или что-то другое, вы можете изменить это.
В итоге вы получите глобальную промежуточную программу, которая проверяет токен аутентификации и присоединяет объект user
к req
. Тогда у вас будет служебная функция, которая называется что-то вроде userHasRole
, которая будет вызываться на любой конечной точке, которая требует определенной роли в приложении. Теперь вы можете проверить разрешения в любой точке приложения. Это может происходить в самых разных местах вашего приложения, например, вы можете проверить, являются ли они администраторами в начале запроса к некоторой панели администратора, но вы можете проверить разрешения позже, если они попытаются получить доступ к определенному ресурсу. При доступе к определенному ресурсу вы можете пропустить их и в последний момент определить, имеют ли они доступ к ресурсу. (Трудно привести конкретный пример, не зная больше о вашем приложении).
В некоторых случаях может быть целесообразно проверить в начале бизнес-логики, в других местах имеет смысл проверить позже. Это не должно иметь значения, вы должны быть в состоянии выполнить эту проверку, когда вам нужно. Это будет полностью зависеть от бизнес-логики, и размещение ее в каждой отдельной функции может оказаться бесполезным, если оно просто форматирует строковый вывод, но может оказаться полезным при попытке извлечь запись из БД.