我设置了一个服务器来验证用户登录,到目前为止,我能够成功验证用户并将他们重定向到成功页面(如果失败,还可以将它们重定向回登录页面(。但是,如果用户未登录,我无法使用自己的快速中间件来限制用户,由于某种原因,我在中间件中的req.isAuthenticate()
检查总是false
。我觉得登录时没有存储我的会话信息,但我不确定。
这是我的设置(请注意,我使用 express-flash-2
而不是connect-flash
因此req.flash()
(
在服务器中.js
// ...
var flash = require('express-flash-2');
var session = require('express-session');
var passport = require('passport');
// ...
server.use(session({
secret: 'keyboard cat',
resave: true,
saveUninitialized: true
}));
server.use(flash());
server.use(passport.initialize());
server.use(passport.session());
passport.use(auth_controller.authStrategy);
passport.serializeUser(auth_controller.authSerializer);
passport.deserializeUser(auth_controller.authDeserializer);
server.get('/maintenance_login', (req, res) => {
res.render('login');
});
server.post('/maintenance_login', passport.authenticate('local', {
successRedirect: '/maintenance',
failureRedirect: '/maintenance_login',
failureFlash: true
}));
// This does basically the same as above
// server.post('/maintenance_login', (req, res, next) => {
// passport.authenticate('local', function(err, user, info) {
// if (err) { return next(err); }
// if (!user) { return res.redirect('/maintenance_login'); }
//
// req.logIn(user, function(err) {
// if (err) { return next(err); }
// console.log('is authenticated?: ' + req.user); // this returns true
// return res.redirect('/maintenance');
// });
// })(req, res, next);
// });
server.get('/maintenance:query?', auth_controller.restrict, maintenance_controller.maintenance_list);
在auth_controller.js
var passport = require('passport');
var LocalStrategy = require('passport-local');
var User = require('../models/user');
exports.authStrategy = new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
}, function (email, password, done) {
User.authenticate(email, password, function(err, user) {
// success message
// error message
done(err, user, err ? { message: err.message } : null);
});
});
exports.authSerializer = function(user, done) {
done(null, user.id);
};
exports.authDeserializer = function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
};
exports.restrict = function (req, res, next) {
console.log('is authenticated?: ' + req.isAuthenticated()); // This always returns false
if (req.isUnauthenticated()) {
res.flash('error', 'Access denied, please log in.');
return res.redirect('/maintenance_login');
}
return next();
}
同样,我的问题是,每当我成功登录时,我都会被踢回/maintenance_login
并且闪光灯显示"Access denied, please log in."
。这意味着限制中间件中的req.isUnauthenticated()
返回true
。
有什么想法吗?
事实证明,错过.Strategy
是至关重要的。将var LocalStrategy = require('passport-local');
更改为var LocalStrategy = require('passport-local').Strategy;
可解决此问题。以防其他人遇到同样的问题。