2012-01-04 14 views
6

Estoy intentando usar un middleware authenticateUser() antes de cargar todas mis páginas. En lugar de incluirlo en cada llamada (como en app.get ('/', authenticateUser, function() ...)), intenté configurarlo con app.use (authenticateUser) justo antes de llamar a app.use (app.router))Node.js - Problema con res.redirect en middleware

Esto no funcionó, sin embargo. authenticateUser es básicamente:

if (req.session.loginFailed) { 
    next() 
else { 
    if (req.session.user_id) { 
     ... 
     if (userAuthenticated) { 
      next(); 
     } else { 
      req.session.loginFailed = true; 
      console.log('setting loginFailed to true'); 
      res.redirect('/login'); 
     } 
    } 
} 

Y luego, en app.get ('/ login') que establece req.session.loginFailed ser falsa;

Esto debería funcionar, pero solo quiero llamarlo a una app.get() o app.post() etc. para una de mis páginas reales. Creo que se llama muchas veces para muchas solicitudes diferentes (porque al cargar una página, se llama muchas veces 'configuración de loginFailed a true')

¿Hay una mejor manera de hacerlo? ¿O debería simplemente llamarlo antes de cada página en mi sitio?

Respuesta

9

Usted está haciendo demasiados controles en mi opinión. Solo una ruta debe manejar el inicio de sesión de usuario (verifique el pase de usuario &, y almacene el nombre de usuario en la sesión si tiene éxito) y debe asignar el middleware de autenticación solo en las rutas que requieren auth (no todas).

He puesto un ejemplo simplificado para que pueda entender mi punto:

La ruta de acceso

app.post('/login', function (req, res) { 
    var variables_set = (req.body.user && req.body.pass); 
    if (variables_set && (req.body.user === 'username') && (req.body.pass === 'password')) { 
    req.session.username = req.body.user; 
    } else { 
    res.redirect('/login?failed=true'); 
    } 
}); 

El middleware de autenticación

if (!req.session.username) { 
    res.redirect('/login'); 
} else { 
    next(); 
} 

se puede ver un ejemplo más completo en acción en la aplicación Nodepad de Alex Young: https://github.com/alexyoung/nodepad (tutoriales para esa aplicación aquí: http://dailyjs.com/tags.html#lmawa)

+1

Bastante, es gracioso porque en realidad estaba trabajando fuera de los tutoriales del nodo. Lo que pasa es que todo mi sitio requiere que hayas iniciado sesión, así que arreglé juntos una forma de no tener que incluirlo manualmente en todas las rutas, pero solo lo incluiré si es el camino correcto. –

+0

Estoy de acuerdo con @alessioalex. Sin embargo, si insiste en el enfoque que ha establecido, asegúrese de que 'app.use (authenticateUser)' esté DESPUÉS del middleware de la sesión. – danmactough

Cuestiones relacionadas