使用mongodb和nodejs授权passportjs中的多个本地策略

时间:2016-11-03 21:06:39

标签: node.js mongodb authorization passport.js passport-local

我正在使用nodejs中的passportjs和mongodb实现多个本地策略进行身份验证。为了实现身份验证,我在deserializeUser中使用了中间件。像这样的东西。我有两种类型的用户,一种是用户,另一种是供应商。供应商将销售产品,用户将购买产品。 我为具有不同本地策略名称的供应商和用户创建了不同的模式。身份验证对我来说很好。

module.exports = function(passport){

// Passport needs to be able to serialize and deserialize users to support persistent login sessions
passport.serializeUser(function(user, done) {

    console.log('user id is: ' + user._id);
    done(null, user._id);
});

passport.deserializeUser(function(id, done) {


    User.findById(id, function (err, user) {
        if(err)
            done(err);
        if(user) {
            done(null, user);
        }
        else {
            Vendor.findById(id, function (err, user) {
                if(err)
                    done(err);
                done(null, user);
            });
        }
    });
});

我想要做的是,'用户'帐户不应该能够访问那些供应商和供应商应该无法访问页面的页面,这对用户来说是有用的。通过这种方式,我希望提供对这两种类型的用户帐户共享的数据的访问控制。 我认为护照不可能,但我们需要为它写一些中间件。我们可以通过一些中间件实现它,还是在npm中有任何包可以用于此目的。如果有人能提供一些简单的中间件的例子,那对我来说真的很有帮助。

1 个答案:

答案 0 :(得分:0)

我通过引入一个字段来解决这个问题' isUser'在'用户'架构和' isVendor'在供应商' schema并将其类型保持为Boolean。现在,当用户注册为“用户”时,它会存储' isUser'如果是真的,当供应商'寄存器,然后它存储' isVendor'是的。我们将供应商和用户存储在两个不同的模式中。 现在在路由处理程序中,我写了一个中间件,就是这样。

/**
* Testing the authorization policy using two different local strategy
*/

router.get('/productsvendor', isAuthenticated, isVendor, function      (req, res) {

res.send('this is product vendor page, which should be seen only by vendors');
});

router.get('/itemuser', isAuthenticated, isUser , function (req, res) {

res.send('this is item user page, which should be seen only by users');

});

现在我在路由处理程序中添加此内容。

{{1}}