node.js without Arbeiten mit Sitzungen in Express.js




passport session (2)

Ich brauche Hilfe, um das Konzept von Sitzungen für eine Webanwendung zu verstehen. Ich betreibe einen Node.js Server mit Express 3.0.

Meine Ziele sind:

  • Erstellen Sie für jeden angemeldeten Benutzer eine Sitzung

  • Speichern Sie diese Sitzung und verwenden Sie sie für die Validierung, wenn der Benutzer bereits angemeldet ist (verhindern Sie, dass zwei Geräte denselben Benutzer zur gleichen Zeit verwenden), und beschränken Sie den Zugriff auf bestimmte Seiten (durch Abgleich der Sitzungs-ID mit anderen Daten)

Ich werde MemoryStore verwenden, um die Sitzungen zu speichern (scheint am einfachsten). Wenn die oben genannten Ziele sinnvoll sind, können Sie eine gründliche Erklärung dazu liefern, wie Sie diese erreichen können?


Express hat schöne examples im Github Repo. Eine davon behandelt die authentication und zeigt, wie der Benutzer an das req.session Objekt req.session wird. Dies geschieht innerhalb der app.post('/login') Route.

Um den Zugriff auf bestimmte Seiten zu beschränken, fügen Sie diesen Routen eine einfache Middleware hinzu

function restrict(req, res, next) {
  if (req.session.user) {
    next();
  } else {
    req.session.error = 'Access denied!';
    res.redirect('/login');
  }
}

app.get('/restricted', restrict, function(req, res){
  res.send('Wahoo! restricted area, click to <a href="/logout">logout</a>');
});

Wie Brandon bereits erwähnt hat, sollten Sie den MemoryStore nicht in der Produktion verwenden. Redis ist eine gute Alternative. Verwenden Sie connect-redis um auf die connect-redis zuzugreifen. Eine Beispielkonfiguration sieht so aus

var RedisStore = require('connect-redis')(express);

// add this to your app.configure
app.use(express.session({
  secret: "kqsdjfmlksdhfhzirzeoibrzecrbzuzefcuercazeafxzeokwdfzeijfxcerig",
  store: new RedisStore({ host: 'localhost', port: 3000, client: redis })
}));

Verwenden Sie MemoryStore nur dann in Express, wenn Sie nicht mehrere Instanzen erstellen (z. B. mit dem Cluster-Modul). Wenn Sie den Lastausgleich auf mehreren Computern durchführen, muss der Load Balancer "sticky / persistent" -Sitzungen verwenden.

Wenn Sie diese Anforderungen erfüllen, müssen Sie bei der Anmeldung nach der Validierung der Anmeldeinformationen nur eine Sitzungsvariable angeben, um die Anmeldung zu bestätigen. Beispiel:

req.session.loggedIn = true;

Wenn Sie überprüfen möchten, ob ein Benutzer angemeldet ist, überprüfen Sie einfach diese Variable.

if (req.session.loggedIn) {
    // user is logged in.
}
else {
    // user is not logged in.
}

Sie haben erwähnt, dass verhindert wird, dass ein einzelner Benutzer mehrere Sitzungen gleichzeitig hat. Um dies zu erreichen, müssen Sie möglicherweise etwas in einer Datenbank speichern, um anzuzeigen, dass der Benutzer angemeldet ist. Ich warne Sie, dies kann gefährlich sein, weil die Sitzung veraltet ist. Was passiert zum Beispiel, wenn sich ein Benutzer anmeldet, sich aber nie abmeldet? Was ist, wenn sie ihr Browserfenster schließen, sodass die Sitzung für immer weg ist?

Express hat kein Konzept für einen Leerlaufsitzungsablauf. Ich habe so etwas implementiert, indem ich alle Sitzungen in der Datenbank zusammen mit einem Zeitstempel, auf den zuletzt zugegriffen wurde, abspeicherte, und dann die Sitzungsdaten auf der Grundlage der Zeit regelmäßig bereinigte. Aber dann müssen Sie auch Ihre Liste aktualisieren, wer angemeldet ist.





express