Wenn ein Benutzer bereits angemeldet ist und versucht, sich erneut in einer neuen Instanz anzumelden, möchte ich, dass er die andere Benutzerinstanz abmeldet. Ich möchte nicht, dass derselbe Benutzer zweimal in meiner Anwendung angemeldet ist.
Derzeit ist die Sitzung in einem Redis-Store gespeichert. Ich verwende Express/Connect, um den Sitzungsspeicher zu verwalten. Eine der verfügbaren Funktionen, die zum Zerstören der Sitzung verwendet werden können, lautet wie folgt:
.destroy(sid, callback)
Ich muss jedoch die Sitzungs-ID finden, bevor ich .destroy () anrufe. In Redis wird der Benutzername als Teil der Sitzung gespeichert.
Frage: Ist es möglich, Redis abzufragen, um die Sitzungs-ID basierend auf dem Benutzernamen zu erhalten?
req.sessionID
liefert Ihnen die ID der Sitzung, wobei req ein Anforderungsobjekt ist.
Für die letzten Leser;
Connect-Middlewares sind seit Version 4 nicht in Express enthalten.
Damit req.sessionID
funktioniert, müssen Sie Folgendes tun:
cookie-parser
und express-session
-Module in Ihrem package.json befinden. Wenn es nicht hinzugefügt wird, fügen Sie sie hinzu:npm install express-session --save npm install cookie-parser --save
app.js
-Datei benötigen, und fügen Sie die erforderlichen Konfigurationsparameter hinzu.var cookieParser = require('cookie-parser'); var session = require('express-session') app.use(cookieParser()); app.use(session({ secret: '34SDgsdgspxxxxxxxdfsG', // just a long random string resave: false, saveUninitialized: true }));
req.sessionID
und req.session.id
verwenden.Speichern Sie die SID mit dem Konto, wenn sich der Benutzer während der Datenbankvalidierung des Benutzerkontoaufrufs .destroy (Sid, Fn) anmeldet, und aktualisieren Sie dann die SID in der Datenbank mit der aktuellen SID des Benutzers.
In meinem Fall mit MongoDB habe ich das so gemacht:
app.post('/login', function(req, res)
{
var sid = req.sessionID;
var username = req.body.user;
var password = req.body.pass;
users.findOne({username : username, password : password}, function(err, result)
{
...
sessionStore.destroy(result.session, function(){
...
users.update({_id: result._id}, {$set:{"session" : sid}});
...
}
...
}
}
Frage: Ist es möglich, Redis abzufragen, um die Sitzungs-ID basierend auf dem Benutzernamen zu erhalten?
Nein. Die Sitzungsschlüssel in redis sind nicht nach dem Benutzernamen benannt.
Hier ist jedoch ein Gedanke: Wenn ein bereits angemeldeter Benutzer versucht, sich erneut anzumelden, können Sie das in Ihrer Anwendung nicht sehen und entweder die alte Sitzung sofort zerstören oder ihnen die erneute Anmeldung nicht erlauben?