ACL应如何在REST API中运行?

时间:2015-06-23 09:30:25

标签: node.js rest express acl

REST API是用ExpressJs 4.x.x / NodeJS编写的。

我们假设一个界面:

app.delete('/api/v1/users/:uid', function (req, res, next) {
...
}

因此,使用该界面可以删除用户。

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

所以,让我们让ACL进入场景。假设在我们的ACL中,我们可以定义角色,资源和权限。 (代码来自http://github.com/OptimalBits/node_acl#middlware。)

app.delete('/api/v1/users/:uid', acl.protect(),  function (req, res, next)   
{
 // ? Delete User with uid = uid or check 
 // ? first if current user is in same company as user uid
}

有两件事需要考虑。一个是保护路由,从未经许可的人到该路由上的HTTP / DELETE(/ api / v1 / users /:uid),另一个是不允许具有角色CustomersAdmin的人员从另一个客户中删除用户。

ACL是否应该同时执行这两项操作?或者它应该保护route / api / v1 / users?

那么,我会像

一样使用它吗?
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)
}

这将允许每个具有角色CustomersAdmin的用户删除他想要的任何用户。 或者最好将每个可能的用户路由定义为资源并定义多个可以与之交互的角色?

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
}

1 个答案:

答案 0 :(得分:3)

我解决这个问题的方法是为每个用户创建一个角色。我使用了一个mongoose post save hook:

acl.addUserRole(user._id, ['user', user._id]);

然后在资源的post保存挂钩中我这样做:

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

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