2017-07-09 1 views
0

Ich habe ein einfaches Authentifizierungssystem, in dem sich ein Benutzer anmelden und dann abmelden kann.Pass 'logout()' funktioniert nicht wie erwartet

Ich habe viele Seiten und viele Routen in meiner app, und jede Strecke hat diese allgemeine Struktur (Ich verwende meine dashboard.hbs Route hier als Beispiel):

router.get('/dashboard', ensureAuthenticated, function(req, res, next) { 
    User.findOne({ username: req.user.username }, function(err, loggedInUser) { 
    if (err) throw err 
    else { 
     res.render('dashboard', { 
     user: loggedInUser 
     }) 
    } 
    }) 
}); 

Insbesondere bin ich Zuweisung loggedInUser zu user wie so in meinem dashboard.hbs teilweise zu nutzen:

<h2 align="center">{{user.first_name}}'s Dashboard</h2> 

Wenn sich abzumelden, ich benutzen Sie einfach den '/logout Route wie folgt:

Das Problem bei diesem Ansatz ist, dass ich user: loggedInUser in jeder Strecke bin zu wiederholen, und ich möchte meinen Code Refactoring es vertrocknen, und definieren Sie den Benutzer, der in nur einmal angemeldet ist, und zu verwenden, die in jeder Teil.

Um dieses Problem zu lösen, habe ich folgendes in meiner server.js Datei:

app.use(function (req, res, next) { 
    res.locals.logged_in_user = req.user 
    next(); 
}); 

Nun, ich bin in der Lage logged_in_user in jedem Teil zu verwenden, ohne es in einer Route zuweisen zu müssen. Dies funktioniert überall, außer beim Abmelden. Beim Abmelden wird die req.user-Eigenschaft (zugewiesen als logged_in_user) nicht sofort entfernt und die Anmeldesitzung wird nicht sofort gelöscht. Ich bin mit dem folgenden Code:

router.get('/logout', function(req, res, next) { 
    req.logout() 
    res.render('logout') 
}); 

Dies ist fast identisch mit der Passport-Dokumentation here.

Sobald ich die Route /logout getroffen habe, muss ich die Seite für die Anmeldesitzung aktualisieren, die gelöscht werden soll. Dies war nicht der Fall, wenn ich in jeder Route user: loggedInUser verwendete. Jetzt, da es refaktorisiert ist, funktioniert es nicht mehr richtig.

Ich sollte auch beachten, dass meine layout.hbs Datei diesen Code enthält:

<ul class="nav nav-pills pull-right"> 
    {{#if logged_in_user }} 
    <li role="presentation"><a href="/dashboard">Dashboard</a></li> 
    <li role="presentation"><a href="/logout">Log Out</a></li> 
    <li role="presentation"><a href="/messages">Messages</a></li> 
    <li role="presentation"><a href="https://stackoverflow.com/users/member">Profile</a></li> 
    {{else}} 
    <li role="presentation"><a href="/login">Login</a></li> 
    <li role="presentation"><a href="/register">Register</a></li> 
    {{/if}} 
</ul> 

Die umstrukturierte Stil, wie lösche ich eine Login-Sitzung des Benutzers?

aktualisieren

Während res.render('logout') scheint nicht zu arbeiten, kann ich res.redirect nur der Benutzer auf die Login-Seite, und zeigen Sie eine Nachricht über die Seite (mit connect-flash), dass sie sich erfolgreich angemeldet haben.

Antwort

1

req.logout() Aufruf löscht req.user (es tut req.user = null, im Grunde), aber Ihre Middleware einen Verweis auf das ursprüngliche Objekt erstellt, das ist das, was res.locals.logged_in_user noch zeigt auf.

Wie für die Sitzung (req.session.user): das wird am Ende der Antwort aktualisiert werden, so nachdem res.render('logout') aufgerufen wurde. Deshalb ist die Verwendung von res.redirect() eine bessere Möglichkeit, die Sitzung nach dem Abmelden zu löschen.

+0

Für diese Art von Situation verwendet 'res.redirect() 'als besser angesehen als' res.render() '? Ich frage, weil ich technisch 'res.render ('logout')' 'immer noch verwenden kann, wenn ich' res.locals.logged_in_user = req.user' nicht verwende, und definiere 'user: loggedInUser' in jeder Route in meiner App – Farid

+1

@Farid Sie können 'logged_in_user' auch im Render-Aufruf überschreiben:' res.render ('logout', {logged_in_user: null}) '. Wenn Sie eine bestimmte "Abmeldeseite" haben, ist das Rendern einer Seite anstelle einer Weiterleitung in Ordnung. – robertklep

+0

Das ist eine großartige Idee. Daran habe ich nicht gedacht. Vielen Dank! – Farid