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.
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
@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