2012-01-04 11 views
6

Próbuję użyć middleware authenticateUser() przed załadowaniem wszystkich moich stron. Zamiast umieszczać go w każdym wywołaniu (jak w app.get ("/", authenticateUser, function() ...)), próbowałem ustawić go za pomocą app.use (authenticateUser) tuż przed wywołaniem app.use (app.router).Node.js - problem z res.redirect w oprogramowaniu pośrednim

To jednak nie działało. authenticateUser jest zasadniczo:

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

A potem w app.get ('/ login') ustawić req.session.loginFailed się fałszywe;

To powinno zadziałać, ale chcę tylko wywołać to na app.get() lub app.post() itp. Dla jednej z moich rzeczywistych stron. Wydaje mi się, że jest on wywoływany wiele razy dla wielu różnych żądań (ponieważ po załadowaniu jednej strony, "ustawienie loginFailed na true" jest wywoływane wiele razy)

Czy istnieje lepszy sposób na zrobienie tego? A może powinienem dzwonić przed każdą stroną w mojej witrynie?

Odpowiedz

9

Podobno robisz zbyt dużo czeków w mojej opinii. Tylko jedna trasa powinna obsługiwać logowanie użytkownika (sprawdź dla użytkownika przepustkę & i zapisz nazwę użytkownika w sesji, jeśli się powiedzie) i powinieneś przydzielić auth middleware tylko na trasach, które wymagają auth (nie wszystkie).

mam znosić uproszczony przykład tak można zrozumieć mój punkt widzenia:

Trasa logowanie

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 middleware

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

Można zobaczyć bardziej kompletny przykład w akcji w aplikacji Nodepad Alexa Younga: https://github.com/alexyoung/nodepad (tutoriale dla tej aplikacji tutaj: http://dailyjs.com/tags.html#lmawa)

+1

Wystarczająco uczciwe, zabawne, ponieważ faktycznie pracowałem nad tutorialami nodepad. Chodzi o to, że cała moja strona wymaga zalogowania, więc zhakowałem razem sposób, by nie musieć ręcznie włączać go na wszystkie trasy, ale uwzględnię to, jeśli jest to właściwe. –

+0

Zgadzam się z @alessioalex. Jeśli jednak kładziesz nacisk na podejście, które opracowałeś, upewnij się, że twój app.use (authenticateUser) jest PO UP oprogramowaniu pośredniczącym. – danmactough

Powiązane problemy