在Node中使用Passport.js,有没有办法允许一个用户冒充另一个用户?例如。作为应用程序的管理员,我希望能够以另一个用户身份登录,而不知道他们的密码。
最简单的是,如果我可以更改序列化的用户数据(用户ID),我会感到满意,因此当调用deserializeUser
时,它将只假定备用用户的身份。我已尝试替换req._passport.session.user
处的值和req.session.passport.user
处的值,但净效应仅仅是我的会话似乎无效并且Passport会将我注销。
答案 0 :(得分:12)
Passport提供req.logIn
方法,以防您想要手动执行身份验证。无论身份验证如何,您都可以使用它登录任何用户。
以下是如何使用它的方法。让管理员正常登录,谁设置了isAdmin
标志。
然后在登录路由中的passport.authenticate
之前放置一个中间件。如果当前已登录用户isAdmin
,系统将仅根据用户名登录新用户。
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);
}
);
答案 1 :(得分:2)
我有另一种冒充方式,因为:
我的工作是:
为具有superadmin角色的用户设置路由,例如/superadmin/impersonate?username=normaluser1
设置req.user.impersonated.userid = normaluser1.userid
然后我有一个中间件,检查用户是否是superadmin并被模仿:
if(req.user.isAdmin&amp;&amp; req.user.impersonated){ req.user.userid = req.user.impersonated.userid; }
另外,我发现this是关于用户模仿的好文章。与我的方法类似,也有助于构建类似的东西。
答案 2 :(得分:1)
你的问题的答案是基本上:不。原因是:99%的时间使用的会话库是对cookie进行签名,因此如果您篡改数据,Web服务器将拒绝它。
解决这个问题的方法是编写自己的护照身份验证策略,显然不会这样做,但我假设您正在讨论如何使用内置策略。