Sails.js(0.9v)控制器的策略定义为:
RabbitController:{
'*': false, nurture : 'isRabbitMother', feed : ['isNiceToAnimals', 'hasRabbitFood'] }
有没有办法将params传递给这些acls,例如:
RabbitController:{
'*': false, nurture : 'isRabbitMother(myparam)', feed : ['isNiceToAnimals(myparam1, myparam2)', 'hasRabbitFood(anotherParam)'] }
这可能会导致这些函数多次用于不同的参数。 谢谢 阿里夫
答案 0 :(得分:12)
策略是带有签名的中间件函数:
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
,但这应该可以让您开始。
答案 1 :(得分:0)
我创建了一个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
};
};
config/policies.json
中的:
{
RabbitController: {
'*': false,
nurture: 'isRabbitMother(\'myparam\')',
feed : ['isNiceToAnimals(\'myparam1\', \'myparam2\')', 'hasRabbitFood(\'anotherParam\')']
}
}
答案 2 :(得分:0)
查看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]
}
//..
};