3

私はexpressjsを使用していて、セッションを使用してログインするためにユーザーを認証したいと考えています。サイト/アプリは、一方ではユーザーがステートレスWebページでさまざまな製品や情報を閲覧および調査できるようにし、これらのページをキャッシュできるようにする必要がありますが、他方では、ユーザーがログインしてセッションを使用して取得したさまざまなコンテンツにアクセスできるようにする機能を備えている必要があります。

したがって、ルートのサブセットではセッション状態をアクティブにし、補完的なサブセット(残りのルート)ではエクスプレスセッションを非アクティブにして、これらのページをキャッシュできるようにする必要があります。

どうすればこれをクリーンな方法で行うことができますか?

セッションをアクティブ化するルートが「/kj%C3%B8p」、「/ bibliotek」、「/register」であるとします。

私は次のようなことを試みました

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');

  var pageName = 'somepage';
  var oneYear = 1000*60*60*24*365;
  app.use(express.bodyParser());
  app.use('/kj%C3%B8p', express.cookieParser());
  app.use('/kj%C3%B8p', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path:'/', maxAge: (5*oneYear), httpOnly: true}}));
  app.use('/bibliotek', express.cookieParser());
  app.use('/bibliotek', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path: '/', maxAge: (5*oneYear), httpOnly: true}}));
  app.use('/registrer', express.cookieParser());
  app.use('/registrer', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path:'/', maxAge: (5*oneYear), httpOnly: true}}));

  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));

});

しかし、これは3つのルートのそれぞれのセッションオブジェクトを再生成し、かなり厄介に見えます。任意のヒント?

4

1 に答える 1

5

ミドルウェアを関数にラップして、特定の URL をブラックリストまたはホワイトリストに登録できます。これはホワイトリストの例です:

function allow(paths, fn) {
  return function(req, res, next) {
    if (~paths.indexOf(req.url)) {
      return fn(req, res, next);
    }
    next();
  }
}

次のようにミドルウェアにラップします。

app.use(allow(['/bibliotek', '/registrer'], express.cookieParser()));

他のミドルウェアにも同じ手法を使用できます。これは、筆者が irc で示した要点に基づいていました。

于 2012-07-25T13:36:48.330 に答える