Jak korzystać z oprogramowania pośredniczącego, aby sprawdzić autoryzację przed wejściem na każdą trasę w Expressie?

Chcę sprawdzić autoryzację użytkowników mojej aplikacji internetowej po wprowadzeniu adresu url. Ale kiedy użyłem indywidualnego oprogramowania pośredniczącego do sprawdzenia autoryzacji, jest bezużyteczne dla już istniejących tras, takich jak:

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);

The authChecker jest nieabled, aby sprawdzić uprawnienia użytkowników, którzy wprowadzili dwa adresy URL. Działa tylko dla nieokreślonych adresów URL.

I zobaczyłem metodę, którą mogę umieścić authChecker pomiędzy trasą a Obsługą trasy, takie as:

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

Ale jak Mogę to osiągnąć w prosty sposób, zamiast umieszczać authChecker na każdej trasie?

Dziękuję bardzo..
Author: Noah Blues, 2013-09-09

3 answers

Tak długo jak

app.use(authChecker);

Jest przed

app.use(app.router);
Zostanie wezwany na każde żądanie. Jednak otrzymasz "zbyt wiele przekierowań", ponieważ jest ono wywoływane dla wszystkich tras, w tym /auth. Aby to obejść, proponuję zmodyfikować funkcję do czegoś takiego jak:
function authChecker(req, res, next) {
    if (req.session.auth || req.path==='/auth') {
        next();
    } else {
       res.redirect("/auth");
    }
}

W ten sposób nie będziesz przekierowywał również do auth url.

 21
Author: guydog28,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-18 15:05:31

Są sposoby, aby podejść do tego problemu, ale oto, co działa dla mnie.

Lubię tworzyć tablicę oprogramowania pośredniczącego dla chronionych i niezabezpieczonych tras, a następnie używać w razie potrzeby.

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
})

Ułatwia to rozszerzenie funkcjonalności dla każdego zakresu middleware poprzez edycję tablicy dla każdego typu trasy. Sprawia to również, że funkcja każdej trasy jest bardziej przejrzysta, ponieważ informuje nas o rodzaju trasy.

Mam nadzieję, że to pomoże.
 20
Author: sintaxi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 19:40:49

Ale kiedy użyłem indywidualnego oprogramowania pośredniczącego do sprawdzenia autoryzacji, jest bezużyteczne dla już istniejących tras

Express uruchomi middleware w kolejności dodanej do stosu. Router jest jedną z tych funkcji oprogramowania pośredniczącego. Tak długo, jak dostaniesz authChecker do stosu przed routerem, będzie on używany przez wszystkie trasy i wszystko będzie działać.

Najprawdopodobniej masz router przed authChecker, ponieważ masz zdefiniowane trasy przed otrzymaniem authChecker do stosu. Upewnij się, że wszystkie połączenia app.use przed wszystkimi połączeniami do app.get, app.post, etc, aby uniknąć irytującego wtrysku routera przez express do stosu middleware.

 1
Author: Peter Lyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-09 14:49:19