Переадресация с сообщением 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');
Надеюсь это поможет.