NodeJS + Express: как защитить URL-адрес
Я использую последние версии NodeJS и ExpressJS (для MVC).
Обычно я настраиваю мои пути отдыха, например:
app.get('/archive', routes.archive);
Теперь я хочу, чтобы мой /admin/*
набор URL-адресов был защищен, я имею в виду, мне нужна простая проверка подлинности, это просто черновик.
Когда пользователь пытается получить доступ, например, /admin/posts
, перед отправкой ему соответствующего представления и данных, я проверяю req.session.authenticated. Если он не определен, я перенаправляюсь на страницу входа.
На странице входа есть простая форма проверки и метод контроллера входа: если пользователь отправляет "правильный пользователь" и "правильный пароль", я устанавливаю переменную сеанса и он аутентифицируется.
То, что мне кажется трудным, или я не понимаю, - это как сделать код "фильтра, я имею в виду проверку подлинности, перед каждым вызовом /admin/ *.
Это имеет какое-то отношение к экспресс-функциям промежуточного слоя?
Спасибо
Ответы
Ответ 1
Да, промежуточное ПО - это именно то, что вы хотите. Функция промежуточного программного обеспечения - это просто функция, которая работает точно так же, как и любой другой обработчик маршрута экспресс-маршрута, поскольку он запускается до вашего фактического обработчика маршрута. Вы могли бы, например, сделать что-то вроде этого:
function requireLogin(req, res, next) {
if (req.session.loggedIn) {
next(); // allow the next route to run
} else {
// require the user to log in
res.redirect("/login"); // or render a form, etc.
}
}
// Automatically apply the `requireLogin` middleware to all
// routes starting with `/admin`
app.all("/admin/*", requireLogin, function(req, res, next) {
next(); // if the middleware allowed us to get here,
// just move on to the next route handler
});
app.get("/admin/posts", function(req, res) {
// if we got here, the `app.all` call above has already
// ensured that the user is logged in
});
Вы можете указать requireLogin
в качестве промежуточного программного обеспечения для каждого из маршрутов, которые вы хотите защитить, вместо использования вызова app.all
с помощью /admin/*
, но делать это так, как я показываю здесь, гарантирует, что вы не можете случайно забудьте добавить его на любую страницу, начинающуюся с /admin
.
Ответ 2
Как и брэндон, но вы также можете пройти маршрут connect
app.use('/admin', requireLogin)
app.use(app.router)
app.get('/admin/posts', /* middleware */)
Ответ 3
Еще более простой подход - добавить следующий код в файл App.js.
var auth = function(req, res, next) {
if(isAdmin) {
return next();
} else {
return res.status(400)
}
};
app.use('/admin', auth, apiDecrement);
Как вы видите, промежуточное ПО прикрепляется к маршруту. Прежде чем ExpressJS идет вперед, он выполняет функцию, которую вы передали в качестве второго параметра.
С помощью этого решения вы можете сделать различные проверки перед отображением сайта конечному пользователю.
Бест.