2016-11-03 4 views
2

Я реализую несколько локальных стратегий для аутентификации с использованием паспортов и mongodb в nodejs. Чтобы добиться аутентификации, я использовал промежуточное программное обеспечение в deserializeUser. Что-то вроде этого. У меня есть два типа пользователей: один - Пользователь, а другой - поставщик. Продавцы будут продавать товары, а пользователи будут покупать товары. Я создал другую схему для поставщиков и пользователей с разными именами локальных стратегий. Аутентификация работает отлично для меня.авторизация для нескольких локальных стратегий в passjs с использованием mongodb и nodejs

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, который мы можем использовать для этой цели. Если кто-нибудь может привести примеры некоторых простых промежуточных программ, это будет действительно полезно для меня.

+0

Почему вы не добавляете атрибут для каждого типа своих пользователей и не проверяете этот атрибут для определения их типа? –

+0

Aᴍɪʀ Итак, вы имеете в виду, что в схеме для пользователя я должен добавить поле, такое как isUser: true; и в схеме поставщика я должен добавить поле, такое как isVendor: true. а затем, если это правда, то только пользователь может получить доступ? это то, что вы имели ввиду. –

+0

Вид ... Я имею в виду, если атрибуты уже разные, вы также можете использовать это. Например, если у продавца есть 'vendor_id', вы можете проверить, есть ли у текущего пользователя это или нет. –

ответ

0

Я решил эту проблему, представив одно поле «isUser» в схеме «Пользователь» и «isVendor» в схеме «Поставщик» и сохранил его тип как Boolean. Теперь, когда пользователь регистрируется как «Пользователь», он сохраняет «isUser» как истинный, и когда регистрируется «Поставщик», он сохраняет «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'); 

});