2012-12-23 28 views
30

Ich versuche, Redis-Sitzungen in mein Authentifizierungssystem in Node.js integriert zu integrieren.So speichern und abrufen Sitzung von Redis

ich in der Lage gewesen connect-redis und Express-Server eingerichtet, um erfolgreich Redis Server.

Hier ist mein Setup (nur die wichtige Bit):

var express = require("express"); 
var RedisStore = require("connect-redis")(express); 
var redis = require("redis").createClient(); 

app.use(express.cookieParser()); 
app.use(express.session({ 
    secret: "thisismysecretkey", 
    store: new RedisStore({ host: 'localhost', port: 6379, client: redis }) 
})); 

Jetzt ... Wie eigentlich schaffe ich, lesen und die Sitzung zerstören? Ich habe Tonnen von Artikeln über die Einrichtung connect-redis und viele Fragen hier auf SO gelesen, aber ich schwöre, jeder stoppt nur auf die Konfiguration und nicht erklären, wie man es tatsächlich verwendet ...

Ich bin mir bewusst, dass das ist wahrscheinlich sehr einfach, aber bitte nicht runter und nur erklären :).

Antwort

19

Das sollte alles sein, was es ist. Sie greifen auf die Sitzung in Ihrem Route-Handler über req.session zu. Die Sitzungen werden automatisch erstellt, gespeichert und gelöscht.

Wenn Sie manuell eine neue Sitzung für einen Benutzer erstellen, rufen req.session.regenerate().

Wenn Sie es manuell speichern, können Sie req.session.save() nennen.

Wenn Sie es manuell zerstören müssen, können Sie anrufen.

Siehe the Connect documentation für die vollständige Liste der Methoden und Eigenschaften.

4

Betrachten Sie diesen Code.

var express = require('express'); 
var redis = require("redis"); 
var session = require('express-session'); 
var redisStore = require('connect-redis')(session); 
var bodyParser = require('body-parser'); 
var client = redis.createClient(); 
var app = express(); 

app.set('views', __dirname + '/views'); 
app.engine('html', require('ejs').renderFile); 

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 

app.get('/',function(req,res){ 
    // create new session object. 
    if(req.session.key) { 
     // if email key is sent redirect. 
     res.redirect('/admin'); 
    } else { 
     // else go to home page. 
     res.render('index.html'); 
    } 
}); 

app.post('/login',function(req,res){ 
    // when user login set the key to redis. 
    req.session.key=req.body.email; 
    res.end('done'); 
}); 

app.get('/logout',function(req,res){ 
    req.session.destroy(function(err){ 
     if(err){ 
      console.log(err); 
     } else { 
      res.redirect('/'); 
     } 
    }); 
}); 

app.listen(3000,function(){ 
    console.log("App Started on PORT 3000"); 
}); 

So müssen Sie connect-redis und geben Ihre Express-Sitzung Instanz, um es installieren.

Dann in Middleware RedisStore mit Serverdetails wie diesem initialisieren.

app.use(session({ 
    secret: 'ssshhhhh', 
    // create new redis store. 
    store: new redisStore({ host: 'localhost', port: 6379, client: client,ttl : 260}), 
    saveUninitialized: false, 
    resave: false 
})); 

Ich legte TTL auf 260, können Sie erhöhen. Nachdem TTL seine Grenzen erreicht hat, löscht es automatisch die Redis-Taste.

In Routern können Sie die Variable req.session zum SET, EDIT oder DESTROY der Sitzung verwenden.

Eine weitere Sache ...

Wenn Sie benutzerdefinierte Cookie wollen heißt nicht genauso wie in Ihrem Redis Laden Sie Cookie-Parser verwenden können, um Cookie-Geheimnisse gesetzt.

Ich hoffe, es hilft.

link: https://codeforgeek.com/2015/07/using-redis-to-handle-session-in-node-js/

Verwandte Themen