2013-03-30 7 views
30

passport.jsを使用して、特定のエンドポイントに正しいパスワードを持つだけでなく、特定のグループのメンバーであるか特定のアクセス権を持っていることを確認します。Passport.jsでのアクセス/グループの確認

私はUSERとADMINのアクセスレベルがあれば簡単にできます。

私は、パスワードの認証にパスポートを使用することができます。私は、ユーザーが認証をパスことを確認することができますルートに続いて

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

を:

app.get('/api/users', 
    passport.authenticate('local'), 
    function(req, res) { 
    res.json({ ... }); 
    }); 

しかし、あなたがADMINのアセスを持っている必要があります言うことができますhit/api/users 'と入力します。自分の戦略を書く必要がありますか?私はローカルユーザーとローカル管理者の戦略を持っている必要があり、それぞれ適切なアクセスレベルを確認しますか?

私はこれをかなり簡単に行うことができると思いますが、私のサイトに異なる認証方法(oauthを使用することがあります)が必要なときに問題が発生し、カスタム* -user、* -adminの戦略を書く必要があります。過度の殺人のようだ。

その他のオプションは、ユーザーが認証された後で各ルートのアクセス/グループを確認することです。しかし、私は可能ならミドルウェアでこれを行うことを好むでしょう。

おかげ

答えて

50

あなたがグループをチェックする簡単なミドルウェアを作成することができます。

var needsGroup = function(group) { 
    return function(req, res, next) { 
    if (req.user && req.user.group === group) 
     next(); 
    else 
     res.send(401, 'Unauthorized'); 
    }; 
}; 

app.get('/api/users', 
    passport.authenticate('local'), 
    needsGroup('admin'), 
    function(req, res) { 
    ... 
    }); 

これはreq.userに格納されているオブジェクトは、プロパティgroupを持っていることを前提としています。このオブジェクトは戦略実装から渡されたオブジェクトで、deserializeUserです。

代替方法はconnect-rolesですが、Passportとどのように統合されているかわかりません。

EDIT:あなたもパスポートとグループチェックミドルウェア組み合わせることができ:

var needsGroup = function(group) { 
    return [ 
    passport.authenticate('local'), 
    function(req, res, next) { 
     if (req.user && req.user.group === group) 
     next(); 
     else 
     res.send(401, 'Unauthorized'); 
    } 
    ]; 
}; 

app.get('/api/users', needsGroup('admin'), function(req, res) { 
}); 
+0

ああ、私は参照してください。エクスプレスで順番に呼び出される一連の「ミドルウェア」機能を使うことができるようです。気づいていない、それを逃している必要があります。マニュアルをもう一度読む時間;)ありがとう、これは完璧です! – lostintranslation

+2

うん、そこには: 'app.VERB(パス、[コールバック...]、コールバック)'です。申し訳ありませんが、私はそれを逃して、あなたの答えで非常に親切でありがとう! – lostintranslation

+0

これは便利な「トリック」です。私は自分自身を忘れています:) – robertklep