2012-01-04 19 views
6

Tüm sayfalarımı yüklemeden önce authenticateUser() aracı kullanıyorum. Her bir aramaya dahil etmek yerine (app.get ('/', authenticateUser, function() ...)) gibi, app.use (authenticateUser) ile app.use (app.router) çağırmadan hemen önce ayarlamayı denedim.). Bununla birlikte, bu, işe yaramadı.Node.js - middleware'de res.redirect ile sorun var

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

Sonra app.get ('/ login') I yanlış olduğu req.session.loginFailed set;: authenticateUser temelde

Bu işe yaramalı, ancak yalnızca benim gerçek sayfalarından biri için bir app.get() veya app.post() vb. Birçok farklı istek için defalarca çağrıldığını düşünüyorum (çünkü bir sayfa yüklendikten sonra 'loginFailed değerini true' olarak adlandırmak pek çok kez çağrılır)

Bunu yapmanın daha iyi bir yolu var mı? Yoksa sitemdeki her sayfadan önce onu çağırmalı mıyım?

cevap

9

Görüşüme göre çok fazla kontrol yapıyorsunuz. Yalnızca bir rota kullanıcı girişini (kullanıcı için & geçişini kontrol etmeli ve başarılı olursa oturumdaki kullanıcı adını saklamalıdır) kullanmalıdır, ve auth ara katmanını yalnızca auth gerektiren (tümü değil) rotalara atamalısınız.

benim açımdan anlayabiliyorum yüzden basitleştirilmiş bir örnek yukarı koyduk:

giriş yolu

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

auth katman

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

görebilirsiniz Alex Young'ın Nodepad uygulamasında daha eksiksiz bir örnek: https://github.com/alexyoung/nodepad (bu uygulama için öğreticiler şu adreste bulunur: http://dailyjs.com/tags.html#lmawa)

+1

Yeterince adil, komik çünkü aslında nodepad öğreticilerden çalışıyordum. İşin aslı, sitemde oturum açmış olmanızın gerekmesidir, bu yüzden tüm rotalara manuel olarak eklememenin bir yolunu bir araya getirdim, ama eğer uygun bir yol varsa onu ekleyeceğim. –

+0

@alessioalex ile katılıyorum. Ancak, ortaya koyduğunuz yaklaşımda ısrar ederseniz, "app.use (authenticateUser)" öğenizin oturum ara katmanından SONRA olduğundan emin olun. – danmactough