Как использовать только ЧАСТЬ функций во вложенных маршрутах NodeJS

#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. Идеально! Спасибо, чувак!