Подтвердить что ты не робот

NodeJS + Express: как защитить URL-адрес

Я использую последние версии NodeJS и ExpressJS (для MVC).

Обычно я настраиваю мои пути отдыха, например:

app.get('/archive', routes.archive);  

Теперь я хочу, чтобы мой /admin/* набор URL-адресов был защищен, я имею в виду, мне нужна простая проверка подлинности, это просто черновик.

Когда пользователь пытается получить доступ, например, /admin/posts, перед отправкой ему соответствующего представления и данных, я проверяю req.session.authenticated. Если он не определен, я перенаправляюсь на страницу входа.

На странице входа есть простая форма проверки и метод контроллера входа: если пользователь отправляет "правильный пользователь" и "правильный пароль", я устанавливаю переменную сеанса и он аутентифицируется.

То, что мне кажется трудным, или я не понимаю, - это как сделать код "фильтра, я имею в виду проверку подлинности, перед каждым вызовом /admin/ *.

Это имеет какое-то отношение к экспресс-функциям промежуточного слоя?

Спасибо

4b9b3361

Ответ 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 идет вперед, он выполняет функцию, которую вы передали в качестве второго параметра.

С помощью этого решения вы можете сделать различные проверки перед отображением сайта конечному пользователю.

Бест.