2012-11-30 14 views
7

sto impostando un'autenticazione base di amministratore, quando l'utente è connesso, chiamo questa funzione nel AuthCallback:nodejs req.session espresso non memorizzare la mia variabile

function checkAdmin (req) { 
    Admin.findOne({ user : req.user.id },function (err, admin, count){ 
    req.session.isAdmin = true; 
    console.log("session : %j",req.session); 
    }) 
} 

E poi faccio

res.redirect('/') 

il codice all'interno del controller index:

console.log("session : %j",req.session); 
    res.render('index', { title: 'Accueil',message: req.flash('info') }); 

E questo è ciò che ottengo nella console:

session : {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path" 
:"/"},"passport":{"user":"5079832df1e9a6485e000001"},"flash":{},"isAdmin":true} 

session : {"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path" 
:"/"},"passport":{"user":"5079832df1e9a6485e000001"},"flash":{}} 

Non capisco perché la sessione non memorizzi il valore isAdmin.

Ho letto alcune altre domande dicendo che la (app.router) posto app.use potrebbe essere una causa, ma lo faccio:

app.use(cookieParser) 
app.use(express.session({store: session_store })); 
app.use(passport.initialize()) 
app.use(passport.session()) 


// routes should be at the last 
app.use(app.router) 

Deve essere una specie di idiota immagino ..

+0

Forse qualcosa di simile questo può aiutare: req.session.regenerate https : //github.com/senchalabs/connect/issues/681 – alditis

+1

Quindi significherebbe che ogni volta che voglio cambiare/aggiungere una variabile nella sessione nI deve usare req.session.regenerate? –

+1

Probabilmente dovresti effettuare il reindirizzamento all'interno della funzione checkAdmin. –

risposta

7

Beh,

Finalmente ho trovato perché non funzionava. Ho fatto il res.redirect al di fuori della mia funzione Admin.findOne. Quindi il client è stato reindirizzato prima che fosse impostata la variabile di sessione.

Questa authCallbackFunction sta lavorando:

exports.authCallback = function (req, res, next) { 
    //Check if the logged in user is an admin 
    Admin.findOne({ user : req.user.id },function (err, admin, count){ 
    var old = req.session; 
     if(!err && admin) 
     req.session.isAdmin = true; 
     res.redirect('/') 
    }) 
} 

E quando la disconnessione dell'utente, non dimenticate di rigenerare la sessione di

// logout 
exports.logout = function (req, res) { 
    req.session.regenerate(function(){ 
    req.logout() 
    res.redirect('/login') 
    }) 

} 
+1

questo è piuttosto difficile da digerire quando vieni dai mondi di codifica "sincrona". Mi è successo anche a me e il tuo q/a qui mi ha aiutato a risolverlo. grazie. – shaharsol

Problemi correlati