Переадресация с сообщением connect-flash при попытке доступа к маршруту, когда вы не вошли в систему

Я хотел бы перенаправить на страницу входа с сообщением об ошибке, когда кто-то пытался получить доступ к моей странице администратора без аутентификации, т.е. когда кто-то пытается обойти страницу входа.

это мое admin конечная точка:

server.get('/admin', isLoggedIn, function (req, res) {
    console.log('Trying to access admin section')
    res.render('admin', {
        user: req.user //get the user out of session and pass to template
    })
});

который содержит следующее isLoggedIn промежуточный слой:

function isLoggedIn(req, res, next) {
    if (req.isAuthenticated())
        return next();
   console.log('Someone is trying to access this page without being authenticated')
    req.flash('loginMessage', 'You need to be authenticated to access this page');
    console.log(req.flash('loginMessage'))
    res.redirect('/login')
}

login Точка доступа определяется следующим образом:

server.get('/login', function (req, res) {
    console.log('Using login route');
    res.render('login',
        {message: req.flash('loginMessage')}
        );
});

Моя проблема, когда кто-то пытается получить доступ к admin страницы, флэш-сообщение не отображается. Однако при попытке войти с поддельными учетными данными сообщения об ошибках действительно появляются на странице входа. Для информации, вот как настроен мой маршрут входа в систему:

server.post('/login', passport.authenticate('local-login', {
    successRedirect:'/admin', // redirect to the secure profile section
    failureRedirect:'/login', //redirect back to the login page if there is an error
    failureFlash: true //allow Flash messages
}));

И я получаю следующие сообщения в терминале:

Someone is trying to access this page without being authenticated
[ 'You need to be authenticated to access this page' ]
GET /admin 302 8.859 ms - 68
Using login route
GET /login 200 79.373 ms - 1930

2 ответа

Решение

В Connect-Flash, когда вы получаете флэш-сообщения, установленные на клавише с req.flash(<key>), он копирует сообщения <key> к временному массиву УДАЛЯЕТ сообщения для этого <key> из внутреннего хранилища флеш-сообщений connect-flash, а затем возвращает этот временный массив.

Итак flash('loginMessage') возвращает пустой на маршруте / логин, потому что вы ранее получили его на isLoggedIn"s console.log(req.flash('loginMessage')),

Я нашел это, когда проверил источники connect-flash. Его здесь: flash.js подключите flash. Приведенные здесь примеры должны быстро дать вам представление.

Если кто-то подходит к этому и выбранный ответ не работает, попробуйте следующее. У меня была та же проблема, но я не "потреблял" ключ на любом этапе, используя console.log и т. Д.

Проблемный вариант кода был следующим. Я вызвал эти инструкции в POST-маршруте:

req.flash('errorMessage', errors.array().map(err => err.msg););
res.redirect('/profile');

Где маршрут GET для "профиля" отображает шаблон EJS с errorMessage: req.flash('errorMessage') среди его входов.

Для меня работало назначение сообщений об ошибках (errors.array().map(err => err.msg)) в переменную и передав эту переменную в connect-flash, вот так:

var errMsgs = errors.array().map(err => err.msg);
req.flash('errorMessage', errMsgs);
res.redirect('/profile');

Надеюсь это поможет.

Другие вопросы по тегам