我如何在节点中用Passport.js模拟另一个用户?
在Node中使用Passport.js,有没有办法让一个用户冒充另一个用户呢? 例如。 作为应用程序的pipe理员,我希望能够以其他用户的身份login,而无需知道密码。
最简单的,我会满意,如果我可以改变序列化的用户数据(用户ID),所以当deserializeUser
被调用时,它将只是假设替代用户的身份。 我已经尝试更换req._passport.session.user
和req._passport.session.user
的值,但净效果只是我的会话似乎变得无效,护照注销我。
如果您想手动进行身份validation,Passport会提供一个req.logIn
方法。 无论身份validation如何,都可以使用它来login任何用户。
以下是如何使用它。 正常pipe理员login,谁将设置isAdmin
标志。
然后在passport.authenticate
之前放置一个中间件,在您的loginpath中进行身份validation。 如果当前login的用户是isAdmin
,这将仅基于用户名login新用户。
app.post('/login', function forceLogin(req, res, next) { if (!req.user.isAdmin) return next(); // skip if not admin User.findOne({ username: req.body.username // < entered username }, function(err, user) { // no checking for password req.logIn(user); res.redirect('/users/' + user.username); }); }, passport.authenticate('local'), function(req, res) { res.redirect('/users/' + req.user.username); } );
我有另一种模仿,因为:
- 我不想弄乱authentication/护照内部的会话存储/login/等你必须了解他们真的很好,他们也容易改变,所以我会说这不是我的select。
- 此外,我想仍然能够告诉,如果行动是从超级用户(模拟)或普通用户(未模拟)。
我所做的是:
-
有superadminangular色模拟用户的路由,例如
/superadmin/impersonate?username=normaluser1
其中设置req.user.impersonated.userid = normaluser1.userid
-
然后我有一个中间件,它检查用户是否是superadmin并被模拟:
如果(req.user.isAdmin && req.user.impersonated){req.user.userid = req.user.impersonated.userid; }
另外,我发现这是关于用户模仿的好文章。 类似于我的方法,并且对于构build类似的东西很有启发。
你的问题的答案基本上是:不。 原因是:99%的时间正在使用的会话库正在对cookie进行签名,所以如果篡改数据,web服务器将拒绝它。
解决这个问题的方法是编写你自己的护照authentication策略,但显然不这样做,但我假设你正在讨论使用内置策略。