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.
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
@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
Das ist eine großartige Idee. Daran habe ich nicht gedacht. Vielen Dank! – Farid