Node.js ACL应该如何在RESTAPI中工作?

Node.js ACL应该如何在RESTAPI中工作?,node.js,rest,express,acl,Node.js,Rest,Express,Acl,RESTAPI是用ExpressJs 4.x.x/NodeJS编写的 让我们假设一个接口: app.delete('/api/v1/users/:uid', function (req, res, next) { ... } 因此,使用该界面可以删除用户 假设系统中有2个客户,每个客户都有用户。用户可以具有删除具有名为CustomerAdmin角色的其他用户的权限。 但该用户应只能删除其公司(客户)的用户 那么,让我们把ACL带到场景中。假设我们可以在ACL中定义角色、资源和权限。(代码采用自

RESTAPI是用ExpressJs 4.x.x/NodeJS编写的

让我们假设一个接口:

app.delete('/api/v1/users/:uid', function (req, res, next) {
...
}
因此,使用该界面可以删除用户

假设系统中有2个客户,每个客户都有用户。用户可以具有删除具有名为CustomerAdmin角色的其他用户的权限。 但该用户应只能删除其公司(客户)的用户

那么,让我们把ACL带到场景中。假设我们可以在ACL中定义角色、资源和权限。(代码采用自。)

有两件事要考虑。一个是保护路由不受未经该路由(/api/v1/users/:uid)上HTTP/DELETE权限的人的攻击,另一个是不允许角色为CustomerAdmin的人删除另一个客户的用户

ACL应该同时做这两件事吗?还是应该保护路由/api/v1/用户

那么,我会像这样使用它吗

acl.allow([
{
  roles:'CustomersAdmin',
  allows:[
   {resources:['/api/v1/users', '/api/v1/users'] permissions:'delete'}
}
app.delete('/api/v1/users/:uid',acl.middleware(3), function(req,res,next)
{
Make sure uid is a User from same Customer as request is from(req.session.userid)
}
这将允许角色为CustomerAdmin的每个用户删除他想要的任何用户。 还是最好将每个可能的用户路由定义为一个资源,并定义多个可以与之交互的角色

acl.allow([
{
  roles:'CustomersAdminOne',
  allows:[
   {resources:['/api/v1/users/1', '/api/v1/users/2'], permissions:'delete'}]
},
{
  roles:'CustomersTwoAdmin',
  allows:[
    {resources:['/api/v1/users/3','/api/v1/users/4'], permissions:'delete'}
  ]
}
app.delete('/api/v1/users/:uid',acl.middleware(), function(req,res,next)
{
no logic needed to be sure that request is from a user within the same customer
}

我解决这个问题的方法是为每个用户创建一个角色。我使用mongoose post保存钩子:

acl.addUserRole(user._id, ['user', user._id]);
然后在资源的post save挂钩中,我执行以下操作:

acl.allow(['admin', doc.user._id], '/album/' + doc._id, ['*']);
acl.allow(['guest', 'user'], '/album/' + doc._id, ['get']);

然后,您可以使用
isAllowed
方法检查
req.user
是否具有正确的权限。

您好,是否有关于如何实现节点acl的教程,我曾尝试在nom上使用该方法,但它对我来说是联网的。我将感谢你的答复
acl.allow(['admin', doc.user._id], '/album/' + doc._id, ['*']);
acl.allow(['guest', 'user'], '/album/' + doc._id, ['get']);