Passport认证的Express站点多用户登录时用户名覆盖问题如何解决
问题解决方案
你的问题根源是全局变量profileName是服务端进程共享的,所有用户请求都会读写同一个变量,自然会出现后登录用户覆盖前者的情况。你已经集成了passport身份认证,直接用passport自动挂载的用户对象就能解决问题,修改步骤如下:
第一步:删除无用的全局变量和赋值逻辑
- 删掉全局作用域下的
var profileName="";这行代码 - 删掉Google认证策略回调里的
profileName=profile.displayName;语句 - 删掉Facebook认证策略回调里的
profileName=profile.displayName;语句
第二步:从请求对象中取当前登录用户信息
passport会在用户登录成功后,将当前用户的信息自动挂载到每个请求的req.user属性上,每个请求的req对象独立,不会出现多用户冲突。修改发布文章的POST接口逻辑:
找到/compose的POST处理代码,将:
const post = new Post({ title: req.body.postTitle, content: req.body.postBody, name: profileName });
修改为:
const post = new Post({ title: req.body.postTitle, content: req.body.postBody, name: req.user.name });
扩展说明
如果你需要在前端页面展示当前登录用户的姓名,可以在渲染模板时将用户信息传入,比如在/blog路由中修改为:
app.get("/blog", function(req, res) { Post.find({}, function(err, posts) { res.render("blog", { startingContent: homeStartingContent, posts: posts, // 传入当前登录用户名,未登录时为undefined可在模板中判断隐藏 currentUser: req.isAuthenticated() ? req.user.name : null }); }); });
修改完成后重启服务即可解决多用户身份信息覆盖的问题。
内容的提问来源于stack exchange,提问作者Paritosh Dalai
相关产品推荐
相关产品推荐

