2017-08-24 2 views
0

Nicht sicher von einem sauberen Weg, um über seine zu gehen. Lassen Sie uns sagen, dass ich diesen Endpunkt haben:nodejs-Pass - Verwenden Sie die gleichen Routen in api, aber geben Sie verschiedene Datensätze basierend auf Berechtigungen zurück

GET /api/Books/ 

Für den Anwender auf den Webservice, diese nur des Benutzers Ressourcen zurück. Es sieht vielleicht so aus:

exports.getBooks = function(req, res) { 
    // find all books for user 
    BookModel.find({ userId: req.user._id }, function(err, books) { 
    if (err) 
     res.send(err); 

    res.json(books); 
    }); 
}; 

Der Webdienst, der die API verwendet, muss zuerst angemeldet sein. Dies kann ich mithilfe einer grundlegenden Passstrategie erreichen, um die Authentifizierung sicherzustellen. Aber nehmen wir an, ich habe einen Administrator-Account, der ALLE jemals aufgenommenen Bücher sehen muss. Darüber hinaus weisen das Administratorkonto und die Benutzerkonten völlig unterschiedliche Eigenschaften auf. Daher ist es nicht ausreichend, für Berechtigungen zuzuweisen. Unter Verwendung des gleichen Endpunkts:

Ich sehe keinen Grund, einen anderen Endpunkt zu schreiben, um dies zu erreichen. Allerdings wäre der Unterschied wie folgt aussehen:

exports.getBooks = function(req, res) { 
    // find all books in the database 
    BookModel.find({}, function(err, books) { 
    if (err) 
     res.send(err); 

    res.json(books); 
    }); 
}; 

Jedoch habe ich nicht mit einem sauberen Weg kommen können diese während erreichen auch den Pass middlewear verwenden, da es wie so gedacht:

router.route('/books') 
    .post(authController.isAuthenticated, bookController.postBooks) 
    .get(authController.isAuthenticated, bookController.getBooks); 

Die Funktion isAuthenticated will nur überprüfen, ob der Benutzer, der Ressourcen anfordert, eine Berechtigung hat und nicht die Art, wie sich der Controller verhält. Ich bin offen für Ideen.

ANTWORT

Der Benutzer @ZeroCho vorgeschlagene Benutzereigenschaften in req.user Objekt zu überprüfen, um festzustellen, was zurückgeschickt werden soll. Das war einfacher als ich erwartet hatte. In meiner Implementierung für die Strategie passport.BasicAuth überprüfe ich, welche Tabelle ein passendes Dokument hat. Sobald der Benutzer in der gemeinsamen Benutzer- oder Admin-Benutzertabelle gefunden wurde, fügen Sie lediglich eine Eigenschaft in das Rückgabeobjekt isMatch ein.

// Basic strategy for users 
    passport.use('basic', new BasicStrategy(
     function(email, password, done) { 
     verifyUserPassword(email, password, 
    function(err, isMatch) { 
     if(err) { return done(err); } 

     // Password did not match 
     if(!isMatch) { return done(null, false); } 

     // Success 
     var userInfo = { 
     email: email, 
     isAdmin: isMatch.isAdmin || false, 
     businessID: isMatch.businessID || false 
     }; 

     return done(null, userInfo); 
    }); 
    }) 
    ); 

Dann können Sie überprüfen, ob .isAdmin oder .businessID in Ihre Anfragen gültig ist.

Antwort

1

trennen Sie Ihre Controller durch if-Anweisung

exports.getBooks = function(req, res) { 
    if (req.user.isAdmin) { // or some other code to check user is admin 
    // find all books in the database 
    BookModel.find({}, function(err, books) { 
     if (err) 
     res.send(err); 
     res.json(books); 
    }); 
    } else { 
    BookModel.find({ userId: req.user._id }, function(err, books) { 
     if (err) 
     res.send(err); 
     res.json(books); 
    }); 
    } 
}; 
+0

die Benutzerkonten von der Öffentlichkeit genutzt sind völlig verschieden von Admin-Konten. Ich habe diese Option in Betracht gezogen. Die Benutzerkonten (Bibliotheken) haben keine Rollen und enthalten hauptsächlich den Unternehmensstandort, Beschreibungsinformationen und Bücher. Der Administrator hat keine Informationen zum Geschäftsstandort und keine Bücher, aber er darf Datensätze ansehen. – Maverick

+0

@Maverick Sie sagten, Admin und Benutzerkonten haben völlig unterschiedliche Eigenschaften. Dann können Sie überprüfen, ob ein Konto eine Eigenschaft von admin hat, die nicht zum Benutzerkonto gehört. – ZeroCho

Verwandte Themen