0

ExpressJSアプリでは、いくつかのURLハンドラーに次のロジックがあります。

  1. ユーザーがリソースにアクセスする権限を持っているかどうかを確認します
  2. もしそうなら、続行します
  3. それ以外の場合は、メインハンドラーにリダイレクトします。

ConnectJSまたはExpressJSを介して、特定のURLハンドラーのプリハンドラーを挿入する方法はありますか?

私は、すべてのハンドラーに対してグローバルにそれを実行できることを知っています(IEの壊れたXDRの結果として欠落しているヘッダーを挿入するために実行します)。

しかし、ハンドラーのサブセットに対してこれを行うことはできますか?

4

2 に答える 2

3

私はこのようなことをします:

lib / auth.js

exports.checkPerm = function(req, res, next){
  //do some permission checks
  if ( authorized ) {
     next();
  } else {
     res.render('/401');
     return;
  }
};

app.js

var auth = require('./lib/auth');
...
app.get('/item/:itemid', auth.checkPerm, routes.item.get);

上記の行のように、最終的なルートハンドラーの前にミドルウェアをスタックできます。同じ関数シグネチャを持ち、next()を呼び出す必要があります。

于 2012-11-14T21:23:45.457 に答える
2

私がこの質問を正しく理解していれば、あなたは次のことを知っています:

// This is too general
app.use(myAuthMiddleware());

そして、あなたはそれを特定のURLハンドラーに手動で追加できることを知っています:

app.get('/user/profile/edit', myAuthMiddleware(), function(req,res){
  /* handle stuff */ });
// but doing this on all your routes is too much work.

エクスプレスの取り付け機能についてあなたが知らないかもしれないこと:

// Matches everything under /static/** Cool.
app.use('/static', express.static(__dirname + '/public'));

またはapp.all()

// requireAuthentication can call next() and let a more specific
// route handle the non-auth "meat" of the request when it's done.
app.all('/api/*', requireAuthentication);
于 2012-11-14T22:35:46.850 に答える