2016-12-19 1 views
0

Ich habe zwei Benutzersammlungen in meiner db und möchte verschiedene Login-Typen für jeden erstellen, daher habe ich zwei Pass-Strategien für meine Site ('local -user '&' lokaler Manager '). Meine Frage ist, wie man den angemeldeten Benutzertyp (nach verwendeter Strategie) in meiner App überprüft?Überprüfen Sie, ob sich der Benutzer per Passport angemeldet hat Strategie (verschiedene Benutzertypen)

In diesem Code überprüft Pass nur Benutzerauthentifizierung, aber ich möchte nach Strategie überprüfen. (ZB: wenn der Benutzer durch ‚local-Manager‘ angemeldet, zeigen dann die Seite)

function isLoggedIn(req, res, next){ 
    if (req.isAuthenticated()) { 
     next(); 
     return; 
    } 
    res.redirect('/login');  
} 
+0

Warum müssen Sie 2 Benutzersammlungen für 2 Benutzertypen erstellen? Wie wäre es mit 1 Benutzersammlung mit 'type' Feld? – willie17

+0

meine Benutzer sind so komplex und ich kann sie nicht auf einer Verwendung Sammlung machen, ist keine Möglichkeit, solche durch verwendete Strategie zu überprüfen ?! –

+1

Ja, es gibt keine Überprüfung nach Strategie. Ich empfehle Ihnen, Ihr Modell zu strukturieren. Zum Beispiel eine 'User'-Sammlung mit nur' username', 'password',' type'-Feld, einer 'NormalUser'-Sammlung mit allen Informationen eines" normalen Benutzers "mit einem Verweis auf' User', einem 'Manager' Sammlung ... Etwas mag das. – willie17

Antwort

0

Es ist besser, Sie Rollenzuordnung für diese.

Wie dem auch sei für jetzt können Sie dieses Konzept verwenden:

var passport = require('passport') 
    , LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    {passReqToCallback: true}, 
    function(req, username, password, done) { 
    req.usedStrategy = 'local-user'; 
    //do auth stuff 
    }); 
    } 
)); 

Und wie diesen:

function isLoggedIn(req, res, next){ 
    if (req.isAuthenticated() && req.usedStrategy === 'local-user') { 
     next(); 
     return; 
    } 
    res.redirect('/login'); 

} 

Sie können auch Sitzung verwenden, wenn Sie es in passport ermöglichen.

+0

es scheint toller Code und Lösung, aber in 'isLoggedIn' Funktion gibt es undefined Wert ... –

+0

Wie kann ich es in Pass Sitzung speichern? –

+0

@pouya Bitte überprüfen Sie dies: https://github.com/jmimi/express-4.x-local-example –

0

Es muss gesagt werden (und war in anderen Antworten/Kommentaren), dass Sie sich wirklich wieder Ihre Modellierung der Domäne ansehen sollten. Benutzerobjekte können sehr einfach sein (nur Login-Informationen) und der Rest kann in andere Modelle/Schemas aufgeteilt werden.

Wie auch immer auf die Antwort auf Ihre ursprüngliche Frage:

Sie auf dem Benutzertyp wechseln. Passport reicht nicht zu weit in den Rest Ihrer Bewerbung. Die Login-Strategien sind außerhalb des eigentlichen Anmeldebereichs nicht bekannt.

function(request, response, next){ 
    request.isManager = !!(request.user && request.user['unique_prop']); 
    next(); 
} 

Dieses nach der Auth-Middleware: in eines der Modelle für eine einzigartige Eigenschaft durch Prüfen

Sie können die als Middleware behandeln und einige zusätzliche Informationen zu dem Request-Objekt hinzufügen. Dann können Sie in Ihrer Route basierend auf request.isManager wechseln. Wenn Sie dies auch in Middleware kapseln, wird es vom Benutzermodell abstrahiert und Sie können es im Hintergrund umgestalten.

Eine weitere Alternative wäre, die Funktion als statische/Methode/virtuell (abhängig von der Implementierung) zum Schema hinzuzufügen, wenn Sie Mungo verwenden.

Hoffe das hilft Wenn Sie weitere Fragen haben, zögern Sie nicht, Kommentare hinzuzufügen, und ich kann die Antwort ändern.

Verwandte Themen