pass nodejs node middlewares data app node.js express middleware

node.js - nodejs - ¿Cómo usar el middleware para verificar la autorización antes de ingresar cada ruta en Express?



middlewares nodejs (3)

Quiero verificar la autorización de los usuarios de mi aplicación web cuando ingresaron a la url. Pero cuando usé un middleware individual para verificar la autorización, es inútil para las rutas ya existentes, como:

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

El authChecker no puede verificar la autorización de los usuarios que ingresaron las dos URL. Sólo funciona para las URL no especificadas.

Y vi un método que puedo poner el authChecker entre la ruta y el controlador de ruta, como:

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

Pero, ¿cómo puedo lograrlo de una manera sencilla en lugar de poner el authChecker en cada ruta?


Pero cuando usé un middleware individual para verificar la autorización, es inútil para las rutas ya existentes

Express ejecutará el middleware en el orden agregado a la pila. El enrutador es una de estas funciones de middleware. Siempre que tenga su authChecker en la pila ANTES del enrutador, todas las rutas lo utilizarán y las cosas funcionarán.

Lo más probable es que tenga el enrutador antes de authChecker porque tiene rutas definidas antes de colocar su authChecker en la pila. Asegúrese de poner todas sus llamadas a app.use antes de las llamadas a app.get , app.post , etc. para evitar la inyección implícita del enrutador en la pila de middleware.


Hay muchas maneras de abordar este problema, pero aquí es lo que funciona para mí.

Me gusta crear una variedad de middleware para rutas protegidas y no protegidas y luego usar cuando sea necesario.

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

Esto facilita la extensión de la funcionalidad para cada ámbito de middleware al editar la matriz para cada tipo de ruta. También hace que la función de cada ruta sea más clara porque nos dice el tipo de ruta que es.

Espero que esto ayude.


Mientras

app.use(authChecker);

es antes

app.use(app.router);

Se llamará para cada solicitud. Sin embargo, obtendrá los "demasiados redireccionamientos" porque se está solicitando para TODAS LAS RUTAS , incluido / auth . Así que para solucionar esto, sugeriría modificar la función a algo como:

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

De esta manera, tampoco redireccionará la URL de autenticación.