ACL如何在REST API中工作?

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

我们假设一个接口:

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

所以用这个界面用户可以删除。

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

所以,让我们来看看ACL。 假设在我们的ACL中,我们可以定义angular色,资源和权限。 (代码从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)的路由,另一个是不允许具有angular色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) } 

这将允许每个有angular色CustomersAdmin的用户删除他想要的任何用户。 还是最好将每个可能的用户path定义为一个资源,并定义可以与它们交互的多个angular色?

 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 } 

我解决这个问题的方式是为每个用户创build一个angular色。 我用mongoose后保存钩子:

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

然后在保存钩子资源我做到这一点:

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

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