7

connect のセッション ミドルウェアでセッションの開始を制御する方法はありますか?

たとえば、高速アプリ構成がある場合:

var app = express();
app.configure(function(){
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser('secret'));
  app.use(express.session({ store:sessionStore, ... }));
});

その後、すべてのリクエストで、セッション Cookie が指定されていない場合、セッションが開始されます。ユーザーが認証された場合にのみセッションを開始したい場合はどうすればよいですか?

たとえば、 と の 2 つのルートがある/protectedとし/loginます。

  • 誰かが/protectedセッション cookie なしでヒットした場合、ミドルウェアは新しいセッションを開始しません。(req.sessionnull)
  • 誰かが/protectedセッション cookie をヒットすると、ミドルウェアはcookieと set に一致するアクティブなセッションがあるかどうかを確認しますがreq.session、新しいセッションは開始しません。(req.session値を持つか、またはnull)
  • 誰かが/login正しいパラメーターでヒットした場合、セッションが明示的に開始され、Cookie が設定されます。

セッションを開始する唯一の方法は、明示的に行う必要があります。

app.post('/login', function(req, res, next) {
  // connect to database and validate user...
  db.authenticate( req.body.user, req.body.pass, function(allow) {
    if (allow) {
      // START SESSION HERE
      // this will send set the cookie
    }
  });
}

既存の接続セッション ミドルウェアでこれを達成する方法はありますか?

4

2 に答える 2

2

あなたがしたいことは、この行を削除することです:

app.use(express.session({ store:sessionStore, ... }))

現在、セッションはデフォルトで無効になっており、セッションを使用するコントローラーを決定するのはあなた次第です:

var useSessions = express.session({ store:sessionStore, ... });

var preCb = function (req, res, next) {
  // authenticate and stuff
  // ....
  if (authenticated === true) {
     next();
  }
};

app.post('/login', useSessions, function(req, res, next) { ... });
app.post('/protected', preCb, useSessions, function(req, res, next) { ... });
于 2013-02-10T23:40:28.343 に答える
0

毎回セッションが開始されても、空になるので問題ありません。アクセスを認証するためにそれを使用しようとしている場合 (そのようです)、最も簡単な解決策は、セッションに属性 (req.session.authenticated = true; など) を設定し、それを確認することです。このように技術的には、訪問者はセッションを持っていますが、req.session.authenticated == true の場合にのみセッションを利用します。これはまさにあなたが探しているものではないかもしれませんが、これが最も簡単な方法です。

于 2013-01-18T01:15:17.103 に答える