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

Как использовать промежуточное программное обеспечение для проверки авторизации перед вводом каждого маршрута в экспресс?

Я хочу проверить авторизацию пользователей моего веб-приложения, когда они вошли в URL-адрес. Но когда я использовал индивидуальное промежуточное программное обеспечение для проверки авторизации, оно бесполезно для уже существующих маршрутов, например:

function authChecker(req, res, next) {
    if (req.session.auth) {
        next();
    } else {
       res.redirect("/auth");
    }
}

app.use(authChecker);
app.get("/", routes.index);
app.get("/foo/bar", routes.foobar);

authChecker недоступен для проверки полномочий пользователей, которые ввели два URL-адреса. Он работает только для неуказанных URL-адресов.

И я увидел метод, который я могу установить authChecker между маршрутом и обработчиком маршрута, например:

app.get("/", authChecker, routes.index);

Но как я могу добиться этого простым способом, а не поместить authChecker в каждый маршрут?

Большое спасибо..

4b9b3361

Ответ 1

Пока

app.use(authChecker);

до

app.use(app.router);

он будет вызван для каждого запроса. Однако вы получите "слишком много перенаправлений", потому что он вызывается для ВСЕХ МАРШРУТОВ, включая /auth. Поэтому, чтобы обойти это, я предлагаю изменить функцию на что-то вроде:

function authChecker(req, res, next) {
    if (req.session.auth || req.path==='/auth') {
        next();
    } else {
       res.redirect("/auth");
    }
}

Таким образом, вы не будете перенаправлять и для URL-адреса auth.

Ответ 2

Есть ли способы приблизиться к этой проблеме, но вот что работает для меня.

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

var protected   = [authChecker, fetchUserObject, ...]
var unprotected = [...]

app.get("/", unprotected, function(req, res){
  // display landing page
})

app.get("/dashboard", protected, function(req, res){
  // display private page (if they get this far)
})

app.get("/auth", unprotected, function(req, res){
  // display login form
})

app.put("/auth", unprotected, function(req, res){
  // if authentication successful redirect to dashboard
  // otherwise display login form again with validation errors
})

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

Надеюсь, что это поможет.

Ответ 3

Но когда я использовал индивидуальное промежуточное программное обеспечение для проверки авторизации, оно бесполезно для уже существующих маршрутов

Express будет запускать промежуточное программное обеспечение в порядке, добавленном в стек. Маршрутизатор является одной из этих функций промежуточного программного обеспечения. Пока вы получаете authChecker в стек перед маршрутизатором, он будет использоваться всеми маршрутами, и все будет работать.

Скорее всего, у вас есть маршрутизатор перед authChecker, потому что у вас есть маршруты, определенные до того, как ваш authChecker попадет в стек. Обязательно поместите все ваши вызовы app.use перед любыми вызовами app.get, app.post и т.д., Чтобы избежать экспрессивного размытия неявной инъекции маршрутизатора в стек промежуточного программного обеспечения.