2013-04-17 22 views
6

Ich mache eine API, die verschiedene Zugriffsebenen hat, der 'Client' darf nur lesen. Aber 'admin' muss Schreibzugriff haben. Die verschiedenen Rollen werden jedes Mal als Richtlinie in Sails.js überprüft und die Rechte in der req.session festgelegt.Sails.js Authentifizierung für Modellaktionen

Ich muss nur dem "Client" keinen Zugriff zum Erstellen, Aktualisieren und Löschen von Aktionen geben, deshalb habe ich einen Controller erstellt, der diese CRUD-Aktionen hat und prüft, ob der Benutzer die richtige Rolle hat. Alle Aktionen mit eingeschränktem Zugriff werden über routes.js an diesen Controller weitergeleitet.

Jetzt ist mein Problem, wenn ich einen Eintrag wie löschen: Category.destroy (req.param ('id')); Gibt mir undefined und hat keine Methode. Anders als von der Dokumentation erwähnt konnte ich das Problem beheben, indem:

var deleted = Category.destroy(req.param('id'), function(err, status) { 
    if (status == 1){ 
     res.json({message: 'Category is deleted'}); 
    } else { 
     res.json({message: 'Oops, something went wrong'}); 
    } 
    }); 

Aber es muss einen anderen Weg geben Authentifizierung zu diesen grundlegenden Maßnahmen anzuwenden. Weil ich jetzt alle Aktionen schreiben muss.

Gibt es etwas falsch mit dem Code für die Löschfunktion, die ich geschrieben habe? Und ist es möglich, Richtlinien anzuwenden und auf Standardmodellaktionen umzuleiten, als ob es überhaupt keine Authentifizierung gäbe?

Antwort

2

einfach alle modifizierte Die Richtlinien benannten die Controller wie in CLI angegeben: "Segel Modellbeispiel generieren" gibt eine Benachrichtigung darüber, dass der Controller als Singular bezeichnet wird. Ich musste also nicht alle Modellaktionen auf den Plural Controller umleiten (Beispiele). Jetzt funktionieren alle grundlegenden CRUD-Aktionen wie es sollte.

Das sails.js Video-Tutorial hat mir sehr geholfen: http://www.youtube.com/watch?feature=player_embedded&v=GK-tFvpIR7c

0

Meine Vermutung (kein Segel Benutzer selbst) würde Sie entweder einen Rückruf übergeben, oder Sie ein Objekt bekommen zurück, die eine done() Methode hat:

Category.destroy(id, function(...) {...});  // method 1 
Category.destroy(id).done(function(...) {...}); // method 2 
+0

Vielen Dank für Ihre Antwort. Ich denke, dass das Umleiten in den Segeln Teil der nicht richtig funktionierenden Aktionen war. Jetzt mit dem neuen Rewrite funktioniert es wie es sollte. Aber danke für deine Zeit! – Loed

11

Sie Richtlinien auf Models oder Controllers Ebene definieren können. Hier ist ein Beispiel aus der /config/policies.js.

module.exports.policies = { 
    // Default policy (allow public access) 
    '*': true, 
    'events': 'eventsPolicy', // Policy for a Model 

    someController: { // Policy for a Controller 
     // Apply the "authenticated" policy to all actions 
     '*': 'authenticated', 

     // For someAction, apply 'somePolicy' instead 
     someAction: 'somePolicy' 
    } 
}; 

Unter der api/policies ist, wo Sie die Zugriffsebene definieren können.

module.exports = function (req, res, next) { 
    if (req.session.user) { 
     var action = req.param('action'); 
     if (action == "create") { 
      req.body.userId = req.session.user.id; 
      req.body.username = req.session.user.username; 
     } 
     next(); 
    } else { 
     res.send("You're not authenticated.", 403); 
    } 
}; 

Hoffe das hilft.