使用mongodb和nodejs对Passportjs中的多个本地策略进行授权
问题描述:
我正在使用nodejs中的passportjs和mongodb实现多个本地策略。为了实现身份验证,我在deserializeUser中使用了中间件。像这样的东西。我有两种类型的用户,一种是用户,另一种是供应商。供应商将销售产品,用户将购买产品。 我已经为供应商和用户使用不同的本地策略名称创建了不同的模式。验证对我来说工作正常。使用mongodb和nodejs对Passportjs中的多个本地策略进行授权
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'并将其类型保持为布尔型来解决此问题。现在,当一个用户注册为'User'时,它将'isUser'存储为true,当'Vendor'注册时,它将'isVendor'存储为true。我们以两种不同的模式存储供应商和用户。 现在在路由处理程序中,我写了一个中间件,就是这样的。
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');
});
为什么你不为每种类型的用户添加一个属性并检查该属性以检测它们的类型? –
Aᴍɪʀ所以你的意思是,在用户的模式中,我应该添加一个字段,如isUser:true;在Vendor模式中,我应该添加一个如isVendor:true的字段。然后如果它是真的,那么只有用户可以访问?你是这个意思吗。 –
种类...我的意思是,如果属性已经不同,那么也可以使用它。例如,如果供应商具有'vendor_id',则可以检查当前用户是否拥有该供应商。 –