2013-03-30 20 views
30

Ich möchte mit pass.js überprüfen, ob Benutzer bestimmte Endpunkte erreichen, wenn sie nicht nur das richtige Kennwort haben, sondern Mitglied einer bestimmten Gruppe sind oder einen bestimmten Zugriff haben.Zugriff/Gruppe in Passport.js überprüfen

Der Einfachheit halber, wenn ich Zugriffsebenen von USER und ADMIN habe.

I Pass verwenden können ein Passwort zur Authentifizierung:

passport.use(new LocalStrategy(
    function(username, password, done) { 
    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
     return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
     return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
    } 
)); 

Dann mit einer Route kann ich sicherstellen, dass der Benutzer übergibt Auth:

app.get('/api/users', 
    passport.authenticate('local'), 
    function(req, res) { 
    res.json({ ... }); 
    }); 

Aber sagen lässt Sie ADMIN acess haben müssen Hit/API/Benutzer. Muss ich meine eigenen Strategien schreiben? IE muss ich eine lokale Benutzer- und lokale Admin-Strategie haben und in jedem die richtigen Zugriffsebenen überprüfen?

Ich denke, dass ich das ziemlich leicht tun kann, aber das Problem entsteht, wenn ich meine Website zu verschiedenen Auth-Methoden haben muss (vielleicht manchmal oauth verwenden), würde ich benutzerdefinierte * -user, * -admin Strategien für jeden schreiben müssen . Scheint wie Overkill.

Andere Option besteht darin, nur den Zugriff/die Gruppe in jeder Route zu überprüfen, nachdem der Benutzer authentifiziert wurde. Aber ich würde das lieber in der Middleware machen, wenn es geht.

Dank

Antwort

50

Sie könnten eine einfache Middleware erstellen, die die Gruppe überprüft:

var needsGroup = function(group) { 
    return function(req, res, next) { 
    if (req.user && req.user.group === group) 
     next(); 
    else 
     res.send(401, 'Unauthorized'); 
    }; 
}; 

app.get('/api/users', 
    passport.authenticate('local'), 
    needsGroup('admin'), 
    function(req, res) { 
    ... 
    }); 

Dies setzt voraus, dass das gespeicherte Objekt in req.usergroup eine Eigenschaft hat. Dieses Objekt ist dasjenige, das von der Strategieimplementierung und deserializeUser übernommen wurde.

Eine Alternative könnte connect-roles sein, aber ich weiß nicht, wie gut das in Passport integriert ist.

EDIT: Sie auch Passport und die Gruppenprüfung Middleware kombinieren könnte:

var needsGroup = function(group) { 
    return [ 
    passport.authenticate('local'), 
    function(req, res, next) { 
     if (req.user && req.user.group === group) 
     next(); 
     else 
     res.send(401, 'Unauthorized'); 
    } 
    ]; 
}; 

app.get('/api/users', needsGroup('admin'), function(req, res) { 
}); 
+0

Oh, wie ich sehe. Es sieht so aus, als könnten Sie eine Reihe von Middleware-Funktionen verwenden, die mit express aufgerufen werden. Habe das nicht mal gemerkt, muss es vermisst haben. Zeit das Handbuch nochmal zu lesen;) Danke, das ist perfekt! – lostintranslation

+2

Ja, da ist es: 'app.VERB (Pfad, [Rückruf ...], Rückruf)'. Entschuldige, dass ich das verpasst habe und danke, dass du so freundlich mit deiner Antwort bist! – lostintranslation

+0

Es ist ein nützlicher "Trick" Ich vergesse mich selbst :) – robertklep

Verwandte Themen