使用护照.js和快递中间件限制页面访问



我设置了一个服务器来验证用户登录,到目前为止,我能够成功验证用户并将他们重定向到成功页面(如果失败,还可以将它们重定向回登录页面(。但是,如果用户未登录,我无法使用自己的快速中间件来限制用户,由于某种原因,我在中间件中的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;可解决此问题。以防其他人遇到同样的问题。

相关内容

  • 没有找到相关文章

最新更新