2016-11-03 8 views
2

nodejのpassportjsとmongodbを使用した認証のための複数のローカル戦略を実装しています。認証を達成するために、私はdeserializeUserでミドルウェアを使用しました。このようなもの。私は2種類のユーザーを持っています.1つはユーザー、もう1つはベンダーです。ベンダーは製品を販売し、ユーザーは製品を購入します。 異なるローカル戦略名を持つベンダーやユーザー向けに異なるスキーマを作成しました。認証は私のために正常に動作します。mongodbとnodejsを使用したpassportjでの複数のローカル戦略の承認

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); 
      }); 
     } 
    }); 
}); 

である私は何をしたい、「ユーザー」アカウントは、ベンダーやベンダーがユーザーのためにそこにある、ページにアクセスできないようにする必要がありそこにあるページにアクセスできないようにする必要があり。このようにして、これらの2つのタイプのユーザーアカウントで共有されるデータに対するアクセス制御を提供したいと考えています。 私はパスポートでは不可能だと思うが、我々はそれのためのいくつかのミドルウェアを書く必要があります。私たちはいくつかのミドルウェアを通してそれを達成できますか?またはこの目的のために使用できるパッケージがnpmにありますか?誰かが単純なミドルウェアの例をいくつか挙げることができれば、本当に役に立ちます。

+0

各タイプのユーザーに属性を追加し、その属性を調べてそのタイプを検出するのはなぜですか? –

+0

Aᴍɪʀつまり、Userのスキーマでは、isUser:trueのようなフィールドを追加する必要があります。 Vendorスキーマでは、isVendor:trueのようなフィールドを追加する必要があります。それが本当ならば、ユーザーだけがアクセスできますか?それはあなたが意味することです。 –

+0

種類...属性がすでに異なる場合は、その属性も使用できます。たとえば、ベンダーが 'vendor_id'を持っている場合、現在のユーザーにそれがあるかどうかを確認することができます。 –

答えて

0

'User'スキーマに 'isUser'フィールドを、 'Vendor'スキーマに 'isVendor'フィールドを1つ導入し、そのタイプをBooleanとして保持することで、この問題を解決しました。今、ユーザーが 'ユーザー'として登録すると 'isUser'がtrueとして保存され、 'Vendor'が登録されると 'isVendor'がtrueとして保存されます。ベンダーとユーザーを2つの異なるスキーマに保管しています。 ルートハンドラでは、ミドルウェアを作成しました。これは次のようなものです。

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'); 

}); 
関連する問題