2013-04-17 16 views
6

Tworzę interfejs API, który ma różne poziomy dostępu, "klient" może tylko czytać. Ale "admin" musi mieć prawo do zapisu. Różne role sprawdzane są każdorazowo jako zasada w pliku Sails.js i określają prawa w wymaganiach.Uwierzytelnianie Sails.js dla działań modelowych

Po prostu muszę dać "klientowi" brak dostępu do tworzenia, aktualizacji i usuwania akcji, dlatego stworzyłem kontroler, który ma te akcje CRUD i sprawdza, czy użytkownik ma odpowiednią rolę. Wszystkie działania, które mają ograniczony dostęp, są przekierowywane przez program routes.js do tego kontrolera.

Teraz mój problem polega na tym, że podczas usuwania wpisu typu: Category.destroy (req.param ('id')); Daje mi niezdefiniowane i nie ma żadnej metody. W przeciwieństwie do wymienionych przez docs udało mi się rozwiązać ten problem tworząc w ten sposób:

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'}); 
    } 
    }); 

Ale tam musi być jakiś inny sposób, aby zastosować uwierzytelnianie do tych podstawowych działań. Ponieważ teraz muszę napisać wszystkie akcje.

Czy jest coś nie tak z kodem dla funkcji usuwania, którą napisałem? Czy możliwe jest zastosowanie zasad i przekierowanie do domyślnych działań modelu, tak jakby w ogóle nie było uwierzytelniania?

Odpowiedz

2

Tak zmodyfikowany wszystko zasady zmieniono nazwę kontrolerów, jak stwierdzono w de CLI: "Żagle generują przykład modelu" zawiera powiadomienie o tym, że kontroler jest nazywany liczbą pojedynczą. Nie musiałem przekierowywać wszystkich akcji modelu do kontrolera liczby mnogiej (przykłady). Teraz wszystkie podstawowe działania CRUD działają tak, jak powinny.

sails.js poradnik wideo bardzo mi pomogło: http://www.youtube.com/watch?feature=player_embedded&v=GK-tFvpIR7c

0

Domyślam (nie użytkownik sam Sails) byłoby Ci albo zdać zwrotnego, lub dostaniesz z powrotem przedmiot, który ma done() metody:

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

Dziękuję za odpowiedź. Myślę, że przekierowanie w żaglach było częścią nieprawidłowo działających działań. Teraz z nowym przepisem działa tak, jak powinien. Ale dziękuję za poświęcony czas! – Loed

11

Można zdefiniować zasady na poziomie Models lub Controllers. Oto przykład z /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' 
    } 
}; 

Pod api/policies gdzie można określić poziom dostępu.

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); 
    } 
}; 

Mam nadzieję, że to pomoże.