Проверьте каждый запрос node.js для аутентификации - PullRequest
26 голосов
/ 31 октября 2011

Я использую node.js с Express и connect-auth для аутентификации пользователей.

Это проверка при запросе / index:

if(req.isAuthenticated()) {
  res.redirect('/dashboard');
} else {
  res.render('index', { layout: 'nonav' });
}

Однако, после выхода из системы и возврата к ф. Е. «/ приборная панель», я вижу приборную панель.

Как я могу поставить проверку подлинности для каждого запроса, чтобы всегда быть действительным пользователем?

Обновление У меня нет проблем с аутентификацией, все отлично работает! Мне нужно решение, которое проверяет каждый маршрут / запрос, если есть действительный пользователь, без добавления функции или оператора if в реализацию маршрута, поскольку все приложение в любом случае нуждается в действительном пользователе. В примере Express-Authentication-Example в определении маршрута используется «restrict», который близок, но для многих маршрутов его легко забыть.

Ответы [ 3 ]

35 голосов
/ 19 ноября 2011
app.all('*',function(req,res,next){
    if(req.isAuthenticated()){
        next();
    }else{
        next(new Error(401)); // 401 Not Authorized
    }
});
// NOTE: depending on your version of express,
// you may need to use app.error here, rather
// than app.use.
app.use(function(err,req,res,next){
    // Just basic, should be filled out to next()
    // or respond on all possible code paths
    if(err instanceof Error){
        if(err.message === '401'){
            res.render('error401');
        }
    }
});

Если вы определяете маршрут all до маршрутов, которые требуют аутентификации, и после маршрутов, которые не (таких как домашняя страница, логин и т. Д.), То это должно влиять только на те маршруты, которые в нем нуждаются. В качестве альтернативы вы можете использовать RegExp вместо '*', который будет включать подпуть или список путей, требующих аутентификации.

Другой вариант - создать функцию для включения в каждый маршрут, требующий аутентификации:

function IsAuthenticated(req,res,next){
    if(req.isAuthenticated()){
        next();
    }else{
        next(new Error(401));
    }
}
app.get('/login',function(req,res,next){
    res.render('login');
});
app.get('/dashboard',IsAuthenticated,function(req,res,next){
    res.render('dashboard');
});
app.get('/settings',IsAuthenticated,function(req,res,next){
    res.render('settings');
});
5 голосов
/ 31 октября 2011

Вы можете использовать механизм sessions, предоставленный connect.Поместите этот код в app.configure(), чтобы включить его:

  app.use(express.cookieParser());
  app.use(express.session({
    secret: 'some string used for calculating hash'
  }));

После этого вы сможете использовать объект req.session (различный для каждого запроса) для хранения ваших данных аутентификации (или чего-либо еще),Итак, ваш пример кода будет выглядеть примерно так:

if (req.session && req.session.authorized) {
  res.redirect('/dashboard');
}
else {
  res.render('index', {layout: 'nonav'});
}

А аутентификация будет выглядеть так:

req.session.authorized = checkPassword(login, passw);

Выйти:

req.session.destroy();

Больше информации можноможно найти здесь .

0 голосов
/ 14 мая 2014

Другой способ - использовать функцию промежуточного программного обеспечения.(Пример в CoffeeScript .)

# middleware
authKick = (req, res, next) ->
  if not do req.isAuthenticated then return res.redirect '/login'
  return do next

# apply
app.use authKick

Это будет работать для каждого запроса, не затрагивая маршруты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...