Node.js - проблема с res.redirect в промежуточном ПО - PullRequest
8 голосов
/ 04 января 2012

Я пытаюсь использовать middleware authenticateUser () перед загрузкой всех моих страниц.Вместо того, чтобы включать его в каждый вызов (как в app.get ('/', authenticateUser, function () ...)), я попытался установить его с помощью app.use (authenticateUser) прямо перед вызовом app.use (app.router).

Однако это не сработало.authenticateUser в основном:

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

А затем в app.get ('/ login') я установил для req.session.loginFailed значение false;

Это должно работать, но я хочу тольковызвать его на app.get () или app.post () и т. д. для одной из моих реальных страниц.Я думаю, что он вызывается много раз для множества разных запросов (потому что после загрузки одной страницы «установка loginFailed в true» вызывается много раз)

Есть ли лучший способ сделать это?Или мне просто звонить перед каждой страницей на моем сайте?

1 Ответ

9 голосов
/ 04 января 2012

По моему мнению, вы делаете слишком много проверок. Только один маршрут должен обрабатывать вход пользователя в систему (проверьте имя пользователя и пароль, и сохраните имя пользователя в сеансе, если все прошло успешно), и вы должны назначать промежуточное ПО аутентификации только для маршрутов, которые требуют аутентификации (не все).

Я привел упрощенный пример, чтобы вы могли понять мою мысль:

Маршрут входа в систему

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

Промежуточное ПО аутентификации

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

Более подробный пример в действии вы можете увидеть в приложении Алекса Янга для Nodepad: https://github.com/alexyoung/nodepad (руководства для этого приложения здесь: http://dailyjs.com/tags.html#lmawa)

...