• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

express + passport: Wie kann ich auf eingeloggt und Adminrechte prüfen?

rockie667

New member
Hallo erstmal,

bin zum ersten mal hier - arbeite auch grad an meinem ersten JS-Projekt... und hab prompt das erste Problem.

Ich möchte zwei Variablen definieren (isLoggedIn und isAdmin), die ich im Frontend verwenden kann. Ich hab in der app.js folgendes gemacht:

Code:
app.use(function (req, res, next) {
  res.locals.isAdmin = false;
  res.locals.isLoggedIn = false;
  if(req.isAuthenticated()) {
    res.locals.isLoggedIn = true;
    isAdmin(req, res, next);
  } else {
    next();
  }
});

und

Code:
function isAdmin(req, res, next) {
  User.findById(req.user._id, function(err, user) {
    if (err) throw err;
    if (user.isAdmin) {
      res.locals.isAdmin = true;
    }
    next();
  });
}

Was passiert ist, dass die Startseite aufgerufen werden kann - also alles gut. Aber bei allen anderen Pfaden passiert erst nichts und irgendwann kommt die Meldung, dass vom Server keine Daten zurückkommen!

Kann mir bitte irgendjemand helfen und mir sagen, wo mein Fehler ist?

Ganz herzlichen Dank schon mal im Voraus!
Hans
 
Was macht denn die Funktion User.findById? Wann wirft die einen Fehler? Was passiert, wenn req.user nicht gesetzt ist? Was, wenn der Benutzer nicht gefunden werden kann?
Wie authentifizierst du genau? Mit Auth-Basic?
Wird etwas in die Console geschrieben?

Fragen über Fragen... ;)
 
Also, ich versuch das mal auseinanderzudröseln:

- Ich verwende mongoose, findById ist eine mongoose-Funktion
- die Funktion isAdmin wird ja nur aufgerufen, wenn der User angemeldet ist, und deshalb von passport ja die userdaten in der session gespeichert sind - in isAdmin ist req.user also auf jeden Fall nicht leer.
- Das Problem, was passiert, wenn der Benutzer nicht gefunden werden kann, hab ich auf später geschoben, da ich glaub, dass das mit dem aktuellen Problem nichts zu tun hat.
- Authentifiziert wird ja via PassportJS über eine local strategy - oder wie soll ich Deine Frage verstehen? Das Authentifizieren klappt ja soweit alles...
- Der Client meldet irgendwann einen empty response Fehler und der server sagt gar nix. Gibt nur eine Meldung über den angefragten Pfad, das wars:
15:02:59 web.1 | GET /wellnessangebote - - ms - -

Kann es sein, dass ich in irgendein Asynchronitätsproblem laufe? Überspringt express einfach asynchron die if-else-Abfrage und läuft dann in einen hängenden Request (wie es in der expressjs doku genannt wird - zumindest so ähnlich)?
 
Lass dir doch mal über console.log() an mehreren Stellen im Code einfach mal Statusmeldungen ausgeben. Dann weißt du, was da genau beim Server passiert und ab wenn er nicht mehr dort ist, wo du denkst, dass er ist.
 
Hm ist zwar schon ein par tage alt, hoffe das wird keine Betragsleiche.

rockie667 schrieb:
die ich im Frontend verwenden kann.
Ein Login mit Frontend und backend handelt man normalerweise über session's.

rockie667 schrieb:
Authentifiziert wird ja via PassportJS
Mit PassportJS bin ich nie klar gekommen, habe mir meine eigene Authentifizierung geschrieben.
Mit sha1 Verschlüsslung.


rockie667 schrieb:
Der Client meldet irgendwann einen empty response Fehler
Ganz klassisch, es wird der Request, Response kreis nicht bis zu ende ausgeführt.

Wenn über die aktuelle Middlewarefunktion der Anforderung/Antwort-Zyklus nicht beendet werden kann, muss next() aufgerufen werden, um die Steuerung an die nächste Middlewarefunktion zu übergeben. Andernfalls geht die Anforderung in den Status “Blockiert” über.
Express-Middleware verwenden


Habe mal gelesen das man Anwendung so schreiben soll das man ohne next() auskommt.
Ich hab jedenfalls noch nie next verwendet.
 
Zurück
Oben