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 */)