Passing Parameters to sails.js policies

2019-03-26 02:58发布

Sails.js (0.9v) controllers have policies defined as:

RabbitController: {

    '*': false, 

    nurture    : 'isRabbitMother',

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

is there a way to pass params to these acls eg:

RabbitController: {

    '*': false, 

    nurture    : 'isRabbitMother(myparam)',

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

This may lead to multiple use of these functions for different params. Thanks Arif

3条回答
何必那么认真
2楼-- · 2019-03-26 03:34

I've created a Sails hook that does the job: https://www.npmjs.com/package/sails-hook-parametized-policies

I still need to write the documentation for it, but you can checkout the test folder to see how it works.

You just need to create a file 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\')']
    }
}
查看更多
smile是对你的礼貌
3楼-- · 2019-03-26 03:42

The policies are middleware functions with the signature:

function myPolicy (req, res, next)

There's no way to specify additional parameters for these functions. However, you could create wrapper functions to create the policies dynamically:

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

}

In practice you'd want to separate this code into another file and require it, but this should get you started.

查看更多
迷人小祖宗
4楼-- · 2019-03-26 03:51

Check out 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]
    }
    //.. 
};
查看更多
登录 后发表回答