2016-09-24 66 views
0

我试图为我的rest API设置访问控制。 Loopback为处理基于用户/角色/委托人的访问提供了一个很好的起点。如何使用Loopback ACL模型/表?

但是,如果我想要的东西超过提供的,例如模型实例的多个所有者?将条目添加到ACL表中就足够了吗?或者我应该创建一个新的角色/解析器,如果可以,我可以/应该重新使用现有的ACL模型/表还是自己推出?

Loopback很棒,但文档缺乏深度,最终导致您阅读源代码。

回答

1

那么在这种特殊情况下,我建议创建一个自定义角色解析器。

事情是这样的:

Role.registerResolver('$inOwners', function (role, ctx, callback) { 
    ctx.model.count({ 
    id: ctx.modelId, 

    // This only works for mongo db... 
    owners: ctx.accessToken.userId 
    }, function(err, count) { 
    if (err) { 
     callback(err); 
    } else if (count) { 
     callback(); 
    } else { 
     callback(new Error('Not Owner')); 
    } 
    }); 
}); 

然后你就可以将其添加到访问控制列表(无论是在车型静态的ACL,在JSON文件,或者将其添加到ACL表):

{ 
    "accessType": "*", 
    "principalType": "ROLE", 
    "principalId": "$inOwners", 
    "permission": "ALLOW", 
    "property": "*", 
    "model": "*" 
} 

请记住,无论何时访问回送方法取决于文档/行内的内容,您只能使用角色解析程序为其定义ACL,否则您必须创建自己的ACL系统。

+0

谢谢! :)。 我的理解是正确的,因为ACL表基本上只是模型json文件中指定的内容的持久性。 您的示例在模型中使用了一个包含对象所有者的字段。如果我想要更多的控制,例如所有者,编辑,个人实例的观众,这可能会在一个新的“instance_acl”表中? –

+0

是的。您可以使用ACL表格来获取动态内容(例如管理员可以管理其他用户的权限),并且这些内容位于模型json文件中,仅用于静态内容。为了获得更多控制权,您可以创建更具体的acl条目,或者您可以在角色解析器中添加更多逻辑。 –