我正在使用MongoDB,并且在我的数据库中有两个集合-用户和角色模型。
这个想法是用户和角色模型是独立的模式-我需要它们分开。我设法成功地“注册”了一个新的用户和角色模型,但是在登录时,只有其中一个可以登录。即如果第一次登录是由用户完成的,则只有用户可以登录-角色模型在登录时获得成功消息,但是req.isAuthenticated
始终为他们返回false。
知道为什么吗? -我在扯头发试图解决这个问题!
登录路径:
router.post('/login', function(req, res, next) {
// my work to see if account belongs to rolemodel or user
if (RoleModel) {
passport.use(new LocalStrategy(
function(username, password, done) {
RoleModel.getUserByUsername(username, function(err, user) {
if (err) throw err;
if (!user) {
return done(null, false);
}
RoleModel.comparePassword(password, user.password, function(err, isMatch) {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false);
}
});
});
}));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
RoleModel.getUserById(id, function(err, user) {
done(err, user);
});
});
passport.authenticate('local', function(err, user, info) {
req.login(user, function(err) {
if (err) {
console.log(err)
} else {
console.log('success')
}
});
})(req, res, next);
} else {
// must be user
passport.use(new LocalStrategy(
function(username, password, done) {
User.getUserByUsername(username, function(err, user) {
if (err) throw err;
if (!user) {
return done(null, false);
}
User.comparePassword(password, user.password, function(err, isMatch) {
if (err) throw err;
if (isMatch) {
return done(null, user);
} else {
return done(null, false);
}
});
});
}));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.getUserById(id, function(err, user) {
done(err, user);
});
});
passport.authenticate('local', function(err, user, info) {
req.login(user, function(err) {
if (err) {
console.log(err)
} else {
console.log('success')
}
});
})(req, res, next);
}
});
我知道我两次进行相同的调用,但是它们只被调用一次-可以查看rolemodel集合或用户集合。我是mongo的新手,想知道这是否是正确的方法吗?
要澄清-如果启动应用程序时我首先以角色模型身份登录,则一切正常。如果我以角色模型身份注销,然后尝试以其他角色模型身份登录,那么一切都很好。但是,当我以角色模型登录后尝试以用户身份登录时,我会收到正确的身份验证消息,但req.isAuthenticated为false。
我做了一些深入的研究:
尝试访问经过身份验证的路由时,用户返回请求(首次登录,对所有用户成功):
headers:
{ 'cache-control': 'no-cache',
'postman-token': '5128e768-7385-4c8d-8833-d1db7b9e709a',
'user-agent': 'PostmanRuntime/7.1.1',
accept: '*/*',
cookie: 'connect.sid=s%3A6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre.O6zEMBnDD4QD6LORYo4l2cKLy9GEyvBBwkHGbBhcUEE',
connection: 'keep-alive' },
sessionStore:
MemoryStore {
sessions: { '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre': '{"cookie":{"originalMaxAge":null,"expires":null,"secure":false,"httpOnly":true,"path":"/"},"passport":{"user":"5b6a2a597523fd8fd711ce20"}}' },
sessionID: '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre',
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: false },
passport: { user: '5b6a2a597523fd8fd711ce20' } },
_passport:
{ instance:
Authenticator {
_key: 'passport',
session: { user: '5b6a2a597523fd8fd711ce20' } },
user:
{ _id: 5b6a2a597523fd8fd711ce20,
尝试访问经过身份验证的路由时,rolemodel返回要求(用户已注销,而不是rolemodel想要登录):
headers:
{ 'cache-control': 'no-cache',
'postman-token': '8aea8381-c81a-4100-b42d-ea2aca5083ed',
'user-agent': 'PostmanRuntime/7.1.1',
accept: '*/*',
cookie: 'connect.sid=s%3A6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre.O6zEMBnDD4QD6LORYo4l2cKLy9GEyvBBwkHGbBhcUEE',
connection: 'keep-alive' },
sessionStore:
MemoryStore {
sessions: { '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre': '{"cookie":{"originalMaxAge":null,"expires":null,"secure":false,"httpOnly":true,"path":"/"},"passport":{"user":"5b6a2a4f7523fd8fd711ce1f"}}' },
sessionID: '6dmDciE6LlmK4_MmiiEfU4PYxNy81Nre',
session:
Session {
cookie:
{ path: '/',
_expires: null,
originalMaxAge: null,
httpOnly: true,
secure: false },
passport: {} },
_passport:
{ instance:
Authenticator {
_key: 'passport',
session: {} },
一个会话,另一个会话没有-但是为什么以及如何解决此问题?帮助或提示将不胜感激-在与这个斗争了将近一个星期后,我现在毫无头绪:(