Паруса.аутентификация js для действий модели


Я создаю API, который имеет разные уровни доступа, "клиент" может только читать. Но "администратор" должен иметь доступ на запись. Различные роли проверяются каждый раз как политика в парусах.js и устанавливает права в req.сессия.

Мне просто нужно дать "клиенту" доступ к созданию, обновлению и удалению действий, поэтому я создал контроллер, который имеет эти действия CRUD и проверяет, имеет ли пользователь правильную роль. Все действия, которые имеют ограниченный доступ, перенаправляются через канал маршруты.js к этому контроллеру.

Теперь моя проблема заключается в том, что когда я удаляю запись типа: категория.уничтожить (req.param ('id')); дает мне неопределенный и не имеет метода done. В отличие от упомянутых в документах, мне удалось решить эту проблему, создав следующее:

   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'});
    }
  });
Но должен быть и другой способ применить аутентификацию к этим основным действиям. Потому что теперь я должен писать все действия.

Что-то не так с кодом для функции delete, которую я написал? И возможно ли это сделать? применить политики и перенаправление к действиям модели по умолчанию, как если бы не было никакой аутентификации вообще?

3 6

3 ответа:

Вы можете определить политику на уровне Models или Controllers. Вот пример из /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'
    }
};

Под api/policies находится место, где можно определить уровень доступа.

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

Надеюсь, это поможет.

Просто модифицировал все политики en переименовал контроллеры, как указано в de CLI: "паруса генерируют пример модели" дает уведомление о контроллере, названном как сингулярный. Поэтому мне не нужно было перенаправлять все действия модели на множественный контроллер (примеры). Теперь все основные действия CRUD работают как надо.

Паруса.видеоурок js мне очень помог: http://www.youtube.com/watch?feature=player_embedded&v=GK-tFvpIR7c

Мое предположение (сам не пользователь Sails) будет вам либо передать обратный вызов, или вы получите объект обратно, который имеет метод done() :

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