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

我正在使用nodejs中的passportjs和mongodb实现多个本地策略。 为了实现身份validation,我在deserializeUser中使用了中间件。 像这样的东西。 我有两种types的用户,一个是用户,另一个是供应商。 供应商将销售产品,用户将购买产品。 我为不同的本地策略名称为供应商和用户创build了不同的模式。 validation对我来说工作正常。

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中的任何包来实现这个目的。 如果任何人都可以举一些简单的中间件的例子,那对我来说真的很有帮助。

通过在“用户”模式中引入一个字段“isUser”和“供应商”模式中的“isVendor”,并将其types保持为布尔型,我解决了这个问题。 现在,当用户注册为“用户”时,它将“isUser”存储为真,当“供应商”注册时,则将“isVendor”存储为真。 我们以两种不同的模式存储供应商和用户。 现在在路由处理程序中,我写了一个中间件,就是这样的。

 var isVendor = function (req, res, next) { if (req.user.isVendor === true) { return next(); } res.redirect('/vendorlogin'); }; var isUser = function (req, res, next) { if(req.user.isUser === true) { return next(); } res.redirect('/login'); }; 

现在我在我的路由处理程序中添加这样的东西。

 /** * 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'); });