node.js - Passport.js 多个本地策略和 req.user

标签 node.js express passport.js passport-local

我的网络应用程序的客户端希望完全将普通用户和管理员分开,因此我正在尝试为 passport.js 实现两个本地策略:

passport.use('local', new LocalStrategy({
    usernameField: 'email'
}, function(email, password, done) {
    User.findOne({ email: email }, function(err, user) {
        if (err) return done(err);
        if (!user) return done(null, false, { message: 'Wrong email or password.' });
        if (!user.validPassword(password)) return done(null, false, { message: 'Wrong email or password.' });
        done(null, user);
    });
}));

passport.use('admin', new LocalStrategy({
    usernameField: 'email'
}, function(email, password, done) {
    Admin.findOne({ email: email }, function(err, admin) {
        if (err) return done(err);
        if (!admin) return done(null, false, { message: 'Wrong email or password.' });
        if (!admin.validPassword(password)) return done(null, false, { message: 'Wrong email or password.' });
        done(null, admin);
    });
}));

passport.serializeUser(function(user, done) {
    done(null, user.id);
});

passport.deserializeUser(function(id, done) {

    Admin.findById(id, function(err, admin) {
        if (err) return done(err);
        if (admin) return done(null, admin);
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });
});

然后在我的 API 管理路由器中:

router.post('/', function(req, res, next) {
    if (typeof req.body.email === 'undefined') return res.json({ success: false, message: 'Email not supplied.' });
    if (!validator.isEmail(req.body.email)) return res.json({ success: false, message: 'Wrong email format.' });
    if (typeof req.body.password === 'undefined') return res.json({ success: false, message: 'Password not supplied.' });
    if (req.body.password.length === 0) return res.json({ success: false, message: 'Password not supplied.' });

    passport.authenticate('admin', function(err, admin, info) {
        if (!admin) return res.json({ success: false, message: info.message });
        req.logIn(admin, function(err) {
            if (err) return res.json({ success: false, message: 'Server error.', reason: err });
            console.log('user:');
            console.log(req.user); // both users and admins go here
            console.log('admin:');
            console.log(req.admin); // undefined
            res.json({ success: true });
        });
    })(req, res, next);

});

事实上,我一直在关注这里的答案:https://stackoverflow.com/a/21898892/1830420 ,而 Matthew Payne 获得了两个 session 变量:req.userreq.sponsor。在我的例子中,即使管理员进行了身份验证,它也会被写入 req.user。现在,为了实现我的客户完全分离用户和管理员的愿望,我想获取 req.userreq.admin,但每次它都被写入 req.user.我认为更改 LocalStrategy 名称会有所帮助,但 passport.js 似乎忽略了策略名称 模型名称。

非常感谢任何帮助。

附言我知道我可以让每个人都处于 User 模型中,并编写一些中间件来根据角色保护某些路由,但不幸的是,我不能在这里选择。

最佳答案

不幸的是,您不能使用 Passport 做到这一点。您将需要创建快速中间件来处理管理员身份验证。

关于node.js - Passport.js 多个本地策略和 req.user,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36102524/

相关文章:

javascript - 在nodejs中操作html文档服务器端?

javascript - Passport 和 express 的基本认证

javascript - 使用 Passport.js facebook 策略进行身份验证后如何使用 Facebook Graph API?

javascript - 如何在 Node JS 中使用 Express 读取带句点的参数?

node.js - Node ,socket.io - 授权失败

javascript - 原型(prototype)中的函数列表

javascript - AngularJS 无法上传文件 Express

node.js - 使用 Passport js 和 Angular 2 进行社会认证

javascript - Nodemailer 多个收件人

node.js - 使用 passport.js 和 express.js (node.js) 制作安全的 oauth API