bom*_*ant 14 authentication mongoose node.js express passport.js
我们有两种类型的用户,管理员和普通用户.
passport.serializeUser(function(user, done) {
console.log('Sear');
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
console.log(id);
console.log("Deser");
User.findById(id, function(err, user) {
if(err) done(err);
if(user){
done(null, user);
}else{
vendorUser.findById(id, function(err, user){
if(err) done(err);
done(null,user);
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
Console.log经常与文本一起输出(即使在单个API请求中)
DESER
两个功能究竟做了什么?详细的答案表示赞赏.TIA.
Nar*_*oni 25
序列化和反序列化是重要的概念.序列化对象意味着将其状态转换为字节流,以便字节流可以恢复为对象的副本.
在典型的Web应用程序中,用于验证用户的凭据仅在登录请求期间传输.如果验证成功,将通过用户浏览器中设置的cookie建立和维护会话.
每个后续请求都不包含凭据,而是包含标识会话的唯一cookie.为了支持登录会话,Passport将对会话进行序列化和反序列化用户实例.
在您编写的代码中,只有用户ID被序列化到会话中.收到后续请求时,将使用此ID查找将要还原到的用户req.user
.
为了让开发人员能够自由地使用他们想要的任何数据库,无论他们想要序列化什么数据,他们都可以以自己的方式完成,序列化和反序列化逻辑留待我们实现.
serializeUser
是在登录请求(在身份验证期间)上调用的方法,如果登录成功,则它将确定应在会话中存储哪些用户信息,并将cookie发送到浏览器以维护该会话。
// Only during the authentication to specify what user information should be stored in the session.
passport.serializeUser(function (user, done) {
console.log("Serializer : ", user)
done(null, user.id);
});
Run Code Online (Sandbox Code Playgroud)
上面的代码片段会将user.id字段保存到会话和cookie中。
deserializeUser
是在所有后续请求上调用并由passport.session
中间件调用的方法。它使我们能够在每个请求上加载其他用户信息。该用户对象以req.user的形式附加到请求中,从而可以在我们的请求处理中访问它。
这是解释它流动性很好的文章