2013-01-18 4 views
7

Gibt es eine Möglichkeit zu steuern, wenn eine Sitzung mit Verbindungssitzungs-Middleware beginnt?Steuern der Sitzung Starten Sie mit Express und verbinden Sie Middleware

Zum Beispiel, wenn ich ausdrücklich app config:

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, ... })); 
}); 

Dann auf jede Anfrage, wenn keine Session-Cookie gegeben wird, wird eine Sitzung gestartet wird. Was passiert, wenn ich eine Sitzung nur dann starten möchte, wenn der Benutzer authentifiziert wurde?

Zum Beispiel sagen, ich habe zwei Routen /protected und /login.

  • Wenn jemand /protected ohne Session-Cookie trifft, wird die Middleware NICHT eine neue Sitzung starten. (req.session ist null)
  • Wenn jemand /protected mit einem Session-Cookie trifft, die Middleware wird Check, um zu sehen, ob es eine passende aktive Sitzung für den Cookie ist und setzte req.session, aber keine neue Sitzung starten. (req.session könnte einen Wert hat oder seine null)
  • Wenn jemand /login mit dem richtigen params trifft, dann wird eine Sitzung explizit und ein Cookie gesetzt wird nur dann gestartet.

Der einzige Weg, um eine Sitzung starten explizit sein soll: mit der bestehenden Verbindung Session-Middleware

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 
    } 
    }); 
} 

Gibt es eine Möglichkeit, dies zu erreichen?

Antwort

0

Auch wenn eine Sitzung jedes Mal gestartet wird, spielt es keine Rolle, weil sie leer ist. Wenn Sie versuchen, den Zugriff zu authentifizieren (was anscheinend der Fall ist), besteht die einfachste Lösung darin, ein Attribut in Ihrer Sitzung festzulegen (z. B. req.session.authenticated = true;) und dies zu überprüfen. Auf diese Weise hat der Besucher technisch gesehen immer eine Sitzung, allerdings wird die Sitzung nur verwendet, wenn req.session.authenticated == true. Es ist vielleicht nicht genau das, wonach Sie suchen, aber es ist der einfachste Weg, dies zu tun.

+1

Wenn Sie verwenden einen Backing-Datenbank-Sitzungsspeicher. Dann erstellt * jeder * anonyme Benutzer Sitzungen, die in der Datenbank gespeichert sind. – ralouphie

+0

Ich verstehe das, aber Sie sollten nicht immer Sitzungsdaten für immer behalten. Wenn die Sitzungsdaten ablaufen, sollten sie entfernt werden. Wenn ein anonymer Benutzer nur einige Seiten auf Ihrer Website besucht, sollte er nach dem Verlassen der Website ziemlich schnell entfernt werden. Auch die Sitzungen für die anonymen Benutzer werden im Wesentlichen leere Objekte sein (korrigieren Sie mich, wenn ich falsch liege) und sollte daher keine große Speicherlast sein. –

+0

Wie die Session-Middleware funktioniert, wird eine Sitzung für jeden Benutzer ohne einen (ohne den Cookie) erstellt. Dies bedeutet, dass die Datenbank einen Eintrag für jede Anfrage hat, die keinen Cookie sendet.In dem System, an dem ich arbeite, ist das inakzeptabel. – ralouphie

2

Was Sie tun möchten, ist diese Zeile zu entfernen:

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

Jetzt Sitzungen sind standardmäßig deaktiviert und es ist an Ihnen zu entscheiden, welche Controller sie verwenden wird:

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) { ... }); 
Verwandte Themen