Sails.js策略,如果一组策略中的一个成功,是否有OR运算符允许操作?

Agg*_*uuu 16 policy sails.js

在config/policies.js中的sails中配置策略时,例如:

    ActivityController: {
        create: ['authenticated'],
        update: ['authenticated', 'isActivityOwner'],
        destroy: ['authenticated' ,'isActivityOwner']
    }
Run Code Online (Sandbox Code Playgroud)

是否有任何功能允许我授予对一组策略中的一个或多个成功的操作的访问权限,例如:

    ActivityController: {
        create: ['authenticated'],
        update: ['authenticated', {or:['isActivityOwner', 'isAdmin']}],
        destroy: ['authenticated' ,'isActivityOwner']
    }
Run Code Online (Sandbox Code Playgroud)

或者可以创建复合策略,以便在一个策略中我可以检查一个或多个其他策略?

如果这两个选项看起来都是糟糕的解决方案,您能否提出一种被认为是更好的做法的方法?

请原谅我,如果这有点明显,但我对帆和节点一般都是新手,并提前感谢任何帮助!

Tra*_*vis 10

我没有在帆船政策中找到任何对运营商的官方支持,但这就是我正在做的事情.

ActivityController: {
    update: ['authenticated', 'orActivityOwner', 'orAdmin', orPolicy],
}
Run Code Online (Sandbox Code Playgroud)

无论orActivityOwnerorAdmin回报next(),就好像它们是有效的.但是他们也为会话变量设置了一个布尔值.请记住,策略是从左到右执行的.我添加了一个orPolicy到底,然后将评估我们的会话变量的状态.

  • 这是一个有用的解决方法,但我认为它有点混乱.也许如果一个人可以提供一个带有运算符的对象,例如`{operator:'OR',policy:['ActivityOwner','Admin']}`会更好.我认为这会更灵活.我将看一下代码,或者询问sails团队是否对这种方法感兴趣.谢谢你的解决方法! (2认同)

小智 7

检查sails-must:

ActivityController: {
    create: 'authenticated',
    update: ['authenticated', must().be.the.owner.or.be.a.member.of('admins')],
    destroy: ['authenticated', must().be.the.owner]
}
Run Code Online (Sandbox Code Playgroud)


mas*_*ver 5

我已经创建了一个帆钩,可以向策略添加参数:https :
//github.com/mastilver/sails-hook-parametized-policies

我设置了一个定义or策略的示例:

module.exports = function(firstPolicy, secondPolicy){

    return function(req, res, next){


        var fakeRes = {};

        for(var i in res){
            if(i === 'forbidden'){
                // override the functions you want the `or` factory to handle
                fakeRes[i] = function(){
                    secondPolicy(req, res, next);
                };
            }
            else{
                fakeRes[i] = res[i];
            }
        }


        firstPolicy(req, fakeRes, next);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用哪种方式:

ActivityController: {
        create: ['authenticated'],
        update: ['authenticated', 'or(isActivityOwner, isAdmin)'],
        destroy: ['authenticated' ,'isActivityOwner']
    }
Run Code Online (Sandbox Code Playgroud)