【发布时间】:2018-03-19 08:46:02
【问题描述】:
我有两种不同的策略'login'和'adminlogin':
app.post('/login', passport.authenticate('login', {
failureRedirect : '/login',
failureFlash : true
}), function(req, res) {
res.redirect('/');
});
app.post('/adminlogin', passport.authenticate('adminlogin', {
failureRedirect : '/adminlogin',
failureFlash : true
}), function(req, res) {
res.redirect('/admin');
});
adminlogin 定义为:
assport.use('adminlogin', new LocalStrategy({
usernameField : 'uname',
passwordField : 'password',
passReqToCallback : true
},
function(req, uname, password, done) {
process.nextTick(function() {
findAdminByUserName(uname, function(err, user) {
if (err) {
console.log("1- ERROR::adminlogin: ", err);
return done(err);
}
if (!user) {
return done(null, false, req.flash('loginMessage', 'Unknown Admin: ' + uname));
}
// Now we do the comparison
CUtil.comparePasswords(password, user.password, user.salt, function (err, isMatch) {
if (err) {
console.log("2- ERROR::adminlogin: ", err);
return done(err, null);
}
if (!isMatch) {
return done(null, false, req.flash('loginMessage','Invalid admin or password'));
}
return done(null, cleanAdminUser(user));
});
});
});}));
附加以下代码:
function cleanAdminUser(pAdmin) {
if (!pAdmin)
return null;
var newAdmin = {
_id: pAdmin._id,
fname: pAdmin.fname,
lname: pAdmin.lname,
uname: pAdmin.uname,
role: 'admin',
};
return newAdmin;}
passport.serializeUser(function(user, done) {
done(null, user._id);});
passport.deserializeUser(function(id, done) {
findById(id, function (err, user) {
done(err, user);
});});
我遇到的问题是,当非管理员用户登录、通过身份验证并最终重定向到用户仪表板时,会话被保持。使用 adminlogin 位会话丢失。
重定向前的管理员:
{ instance:
Authenticator {
_key: 'passport',
_strategies: { session: [Object], login: [Object], adminlogin: [Object] },
_serializers: [ [Function] ],
_deserializers: [ [Function] ],
_infoTransformers: [],
_framework:
{ initialize: [Function: initialize],
authenticate: [Function: authenticate] },
_userProperty: 'user',
_sm: SessionManager { _key: 'passport', _serializeUser: [Function: bound ] },
Authenticator: [Function: Authenticator],
Passport: [Function: Authenticator],
Strategy: { [Function: Strategy] Strategy: [Circular] },
strategies: { SessionStrategy: [Object] } },
***session: { user: 59f3c0d7f75cc7ef38733644 }*** }
重定向后的管理员(isAuthenticated()):
{ instance:
Authenticator {
_key: 'passport',
_strategies: { session: [Object], login: [Object], adminlogin: [Object] },
_serializers: [ [Function] ],
_deserializers: [ [Function] ],
_infoTransformers: [],
_framework:
{ initialize: [Function: initialize],
authenticate: [Function: authenticate] },
_userProperty: 'user',
_sm: SessionManager { _key: 'passport', _serializeUser: [Function: bound ] },
Authenticator: [Function: Authenticator],
Passport: [Function: Authenticator],
Strategy: { [Function: Strategy] Strategy: [Circular] },
strategies: { SessionStrategy: [Object] } },
***session: {}*** }
isAuthenticated 的代码:
function ensureAuthenticated(req, res, next) {
console.log(req._passport);
if (req.isAuthenticated()) {
return next();
}
//Passport.authenticate('adminlogin', {session: false})(req, res, next);
//res.redirect('/login');
res.send({loggedOut:true});}
我如何签入isAuthenticated() 使用adminlogin 的用户,因为默认行为仅检查login?
【问题讨论】:
标签: node.js passport.js passport-local