Передача параметров в политики Sailes.js

Контроллеры Sails.js (0.9v) имеют политики, определенные как:

Контроллер Кролика: {

    '*': false, 

    nurture    : 'isRabbitMother',

    feed : ['isNiceToAnimals', 'hasRabbitFood']
}

есть ли способ передать параметры этим спискам доступа, например:

Контроллер Кролика: {

    '*': false, 

    nurture    : 'isRabbitMother(myparam)',

    feed : ['isNiceToAnimals(myparam1, myparam2)', 'hasRabbitFood(anotherParam)']
}

Это может привести к многократному использованию этих функций для разных параметров. Спасибо, Ариф.


person Arif    schedule 09.03.2014    source источник


Ответы (3)


Политики являются функциями промежуточного программного обеспечения с подписью:

    function myPolicy (req, res, next)

Для этих функций нельзя указать дополнительные параметры. Однако вы можете создать функции-оболочки для динамического создания политик:

    function policyMaker (myArg) {
      return function (req, res, next) {
        if (req.params('someParam') == myArg) {
          return next();
        } else {
          return res.forbidden();
        }
      }
    }

    module.exports = {

      RabbitController: {
        // create a policy for the nurture action
        nurture: policyMaker('foo'),
        // use the policy at 
        // /api/policies/someOtherPolicy.js for the feed action
        feed: 'someOtherPolicy'
      }

    }

На практике вы захотите выделить этот код в другой файл и require его, но это должно помочь вам начать работу.

person sgress454    schedule 10.03.2014
comment
Большое спасибо @ScottGress, это означает, что у нас нет привязки для передачи имени функции в виде строки ... ???? для например. nurture : 'somefunctioname', спасибо, что указали на это - person Arif; 10.03.2014
comment
Вы по-прежнему можете обращаться к политикам по имени; при этом будет запущена политика с этим именем файла в /api/policies. Это то, что вы будете делать в большинстве случаев. - person sgress454; 10.03.2014
comment
Кстати, если этот ответ помог вам, вы можете принять его, чтобы он не оставался без ответа. - person sgress454; 21.03.2014

Я создал крючок Sails, который выполняет эту работу: https://www.npmjs.com/package/sails-hook-parametized-policies

Мне все еще нужно написать для него документацию, но вы можете проверить тестовую папку, чтобы увидеть, как это работает.

Вам просто нужно создать файл api/policiesFactories/isNiceTo.js:

module.exports = function(niceTo){
    return function(req, res, next){
        // policy code
    };
};

in config/policies.json:

{
    RabbitController: {
        '*': false, 
        nurture: 'isRabbitMother(\'myparam\')',
        feed : ['isNiceToAnimals(\'myparam1\', \'myparam2\')', 'hasRabbitFood(\'anotherParam\')']
    }
}
person mastilver    schedule 16.06.2015

Ознакомьтесь с sails-must.

// in config/policies.js 

var must = require('sails-must')();

module.exports = {
    //.. 
    RabbitController: {
        nurture: must().be.a('rabbit').mother,
        feed: [must().be.nice.to('rabbits'), must().have('rabbit').food]
    },

    DogController: {
        nurture: must().be.a('dog').mother,
        feed: [must().be.nice.to('dogs'), must().have('dog').food]
    }
    //.. 

    //.. 
    SomeController: {
        someAction: must().be.able.to('read', 'someModel'),
        someOtherAction: must().be.able.to('write', 'someOtherModel').or.be.a.member.of('admins'),
        someComplexAction: must().be.able.to(['write', 'publish'], 'someDifferentModel')
    }
    //.. 

    //.. 
    ProjectController: {
        sales: must().be.a.member.of('sales').or.a.member.of('underwriting'),
        secret: must().not.be.a.member.of('hr')
    }
    //.. 

    //.. 
    MovieController: {
        adults: must().be.at.least(18, 'years').old,
        kids: must().be.at.most(17, 'years').old,
        teens: [must().be.at.least(13, 'years').old, must().be.at.most(19, 'years').old]
    }
    //.. 
};
person clud    schedule 31.08.2015