NodeJS + Express: как защитить URL-адрес
Я использую последние версии NodeJS и ExpressJS (для MVC).
обычно я настраиваю свои пути rest следующим образом, например:
app.get('/archive', routes.archive);
Теперь я хочу, чтобы мои /admin/*
набор URL-адресов для защиты, я имею в виду, что мне нужна простая аутентификация, это просто черновик.
когда пользователь пытается получить доступ, например, /admin/posts
, перед отправкой ему соответствующего представления и данных, я проверяю req.сессия.опознанный. Если он не определен, я перенаправляю на логин страница.
страница входа имеет простую форму проверки и метод контроллера входа: если пользователь отправляет "правильный пользователь" и "правильный пароль", я устанавливаю переменную сеанса, и он аутентифицируется.
что мне трудно, или я не понимаю, как на самом деле сделать "фильтр" код, я имею в виду проверку подлинности, перед каждым вызовом /admin/* path.
Это имеет какое-то отношение к функциям "middleware" express?
спасибо вы
3 ответов
да, middleware именно то, что вы хотите. Функция промежуточного ПО - это просто функция, которая работает так же, как и любой другой обработчик экспресс-маршрута, expept она запускается до фактического обработчика маршрута. Можно, например, сделать что-то вроде этого:
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
.
еще более простым подходом было бы добавить следующий код в приложение.файл js.
var auth = function(req, res, next) {
if(isAdmin) {
return next();
} else {
return res.status(400)
}
};
app.use('/admin', auth, apiDecrement);
Как вы можете видеть, промежуточное ПО подключается к маршруту. Прежде чем ExpressJS пойдет вперед, он выполняет функцию, которую вы передали в качестве второго параметра.
С помощью этого решения вы можете сделать различные проверки перед отображением сайта для конечного пользователя.
лучшие.
как Брэндон, но вы также можете пойти connect
маршрут
app.use('/admin', requireLogin)
app.use(app.router)
app.get('/admin/posts', /* middleware */)