2013-03-15 9 views
6

私はNodeでExpressを使ってRESTfulなAPIを実装しています。基本的な認証を使用してアクセスを制御したいと考えています。Expressにホワイトリストを持つルートで基本認証/ミドルウェアを適用できますか?

私はホワイトリストのようなものを使用してそれを適用したいと思いますが、それをどうやって行うのか分かりません。

ブラックリスト第二引数と簡単ですが、私ができるだけコショウ私#VERB呼び出し:

app.get('/', asyncAuth, requestHandler); 

私はさらにとはしてすべてをブラックリストに載せることを取ることができます:

app.all('*', asyncAuth, requestHandler); 

しかし、私は、適用したいですすべての単一ルートへの私のbasicAuth を除いてPOST /usersのために。それを行うためのエレガントな方法はありますか? 「ブラックリスト」アプローチを使用して、それを選択的に私が望むルートから削除することはできますか?私はどのように把握できませんでした。

+1

興味深い質問を、私はあなたの質問はどのように」の詳細です推測します「負のルートを選択する」、つまり、いくつかのルートを除くすべてのルートを明示的に優雅にマッチさせます。あなたはregexとルートを照合し、 "/ users"を否定することができます。例えば、http://stackoverflow.com/questions/6586197/expressjs-bind-all-routes-except-2-folders? –

+0

ありがとうございました!私はそれを言い表すのに困っていた。否定的なルートを選択することは私がしたいことです。 私は正規表現を使うと考えましたが、うまくいくでしょうが、ちょっとハックのように感じました。それはより良い方法があるべきであるように思えた。 – Terraflubb

答えて

8
をホワイトリストに登録されている正規表現のリストを維持し、リスト内の各URLに対してURLと一致して、それが一致した場合に任意のその後進めることができ

は、ブラックリストに載ったルート前POST /usersのためのあなたのルートを定義します。

app.post('/users', function(req, res) { 
    ... 
}); 

app.all('*', asyncAuth, requestHandler); 
+0

これは簡単で、私には起こりませんでした! – Terraflubb

2

あなたが認証を必要と

app.all('*', asyncAuth); 

function asyncAuth(req, res, next) { 
    var done = false; 
    whitelist.forEach(function(regexp) { 
     if (req.url.match(regexp)) { 
      done = true; 
      next(); 
     } 
    }); 
    if (!done) requireAuth(next); 
} 

他に、これらの線に沿って何か

+0

はい!それはうまくいくでしょう。私はexpress.basicAuth(function(username、password){...}を排他的に使用していたので、 'req'にアクセスできないと思ったのですが、これはきちんとしたトリックです。 私はこれをこの種の回避策なしで誰かがそれを行う方法を知っていない限り、解決策はありません。 – Terraflubb

関連する問題