2016-11-03 49 views
2

我正在使用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中的任何包來實現這個目的。如果任何人都可以舉一些簡單的中間件的例子,那對我來說真的很有幫助。

+0

爲什麼你不爲每種類型的用戶添加一個屬性並檢查該屬性以檢測它們的類型? –

+0

Aᴍɪʀ所以你的意思是,在用戶的模式中,我應該添加一個字段,如isUser:true;在Vendor模式中,我應該添加一個如isVendor:true的字段。然後如果它是真的,那麼只有用戶可以訪問?你是這個意思嗎。 –

+0

種類...我的意思是,如果屬性已經不同,那麼也可以使用它。例如,如果供應商具有'vendor_id',則可以檢查當前用戶是否擁有該供應商。 –

回答

0

我通過在'用戶'模式中引入一個字段'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'); 

});