#node.js #routes #protection #nested-routes
Вопрос:
Итак, у меня есть маршрутизатор schoolsRouter
, где обрабатываются все функции, связанные со школой (вход в школу, добавление нового учителя и т. Д.). И я хочу admin
, чтобы приложение могло добавлять и удалять новые школы. Теперь шаблон, который я использую, инкапсулирует все функции маршрутизации в одном файле schools.routes.js
, в котором представлена School
модель. Таким createSchool
образом, deleteSchool
маршруты и находятся в schools.routes.js
, но мне нужен только администратор, чтобы иметь возможность выполнять эти операции, и это кажется довольно простым с merged routes
таким (в admins.routes.js
):
adminsRouter.use('/schools/', schoolsRouter);
но проблема в том, что теперь администратор может получить доступ ко всем остальным маршрутам schools.routes.js
schools/login
, чего я не хочу. Итак, как я могу adminsRouter
использовать операции создания и удаления из schoolsRotuer
приложения, не имея доступа ко всем этим другим функциям? (Имея в виду, что я использую аутентификацию JWT).
Комментарии:
1. Эй, я был бы очень признателен, если бы кто-нибудь также мог помочь мне с названием этого вопроса лучше, потому что мне было действительно трудно найти название для такого вопроса.
Ответ №1:
Вы можете использовать промежуточные программы в маршрутах, которые вы хотите контролировать.
Это промежуточное программное обеспечение, которое я назову admin-middleware.js
module.exports = (req, res, next) => {
if (user.admin === true) {
return next();
} else {
return res.status(403).send('Unauthorized')
}
}
Итак, это ваша маршрутная декларация по адресу schools.routes.js
const adminMiddleware = require('../YOUR_FOLDERS/admin-middleware.js');
schools.delete('/:id', adminMiddleware, (req, res) => {
return res.send('ok');
});
Если вы хотите игнорировать маршрут, вы можете использовать эту проверку в своем коде в промежуточном программном обеспечении.
if(req.originalUrl.includes('/schools/login'))
return next();
Я надеюсь, что это сработает для вас.
Комментарии:
1. Это сработало идеально! Спасибо тебе!
2. Эй, у меня все еще есть одна проблема. Как насчет
login
маршрута? Я не могу защитить это с помощью промежуточного программного обеспечения, потому что пользователи в этот момент не вошли в систему, так как я могуadminsRouter
запретить доступ кschools/login
маршруту?3. @M. Olaby Вы можете просто игнорировать промежуточное программное обеспечение на своем маршруте или использовать пример, который я отредактировал выше.
4. Идеально! Спасибо, чувак!