2012-09-05 136 views
19

Estoy usando las últimas versiones de NodeJS y ExpressJS (para MVC).NodeJS + Express: cómo proteger una URL

lo general configuro mis caminos de descanso de este tipo, por ejemplo:

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

ahora quiero mi /admin/* conjunto de direcciones URL para ser asegurado, quiero decir que necesito autenticación sólo simple, es sólo un borrador.

Cuando un usuario intenta acceder, por ejemplo, /admin/posts, antes de enviarle la vista y los datos correspondientes, compruebo si hay una sesión.authenticted. Si no está definido, me redirige a la página de inicio de sesión.

La página de inicio de sesión tiene un formulario de validación simple y un método de controlador de inicio de sesión: si el usuario envía "usuario correcto" y "contraseña correcta" configuro la variable de sesión y se autentica.

Lo que me parece difícil, o no entiendo, es cómo hacer realidad el "filtro" código, es decir, la comprobación de autenticación, antes de cada/admin/* ruta de acceso.

¿Tiene esto algo que ver con las funciones de "middleware" express?

Gracias

Respuesta

59

Sí, Middleware es exactamente lo que quiere. Una función de middleware es solo una función que funciona igual que cualquier otro manejador de ruta Express, espere que se ejecute antes que su manejador de ruta real. Podría, por ejemplo, hacer algo como esto:

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

puede especificar requireLogin como un middleware para cada de las rutas que desea proteger, en lugar de utilizar la llamada app.all con /admin/*, pero hacerlo la forma en que muestro aquí garantiza que no pueda olvidarse accidentalmente de agregarla a cualquier página que comience con /admin.

+1

wow .... así que StackOverflow ¡A veces funciona! : D ehehe Gracias, es exactamente el tipo de respuesta que esperaba. Lo intentaré por la tarde y aceptaré tu excelente respuesta si todo funciona. THX otra vez –

+0

¡Me alegra ayudar! Háganos saber si tiene más preguntas sobre este tema.^_^ –

+0

¿Cuál es la diferencia con el uso de token? –

1

Al igual que Brandon, pero también se puede ir a la ruta connect

app.use('/admin', requireLogin) 
app.use(app.router) 

app.get('/admin/posts', /* middleware */) 
+3

¿qué quieres decir? : - \ –

1

Un enfoque aún más simple sería añadir el siguiente código en el archivo app.js.

var auth = function(req, res, next) { 

    if(isAdmin) { 

     return next(); 

    } else { 

     return res.status(400) 

    } 
}; 

app.use('/admin', auth, apiDecrement); 

Como puede ver, el middleware se adjunta a la ruta. Antes de que ExpressJS continúe, ejecuta la función que aprobó como el segundo parámetro.

Con esta solución puede realizar diferentes comprobaciones antes de mostrar el sitio al usuario final.

Mejor.

Cuestiones relacionadas