Sch*_*iii 9 rest acl node.js express
REST API是用ExpressJs 4.xx/NodeJS编写的.
我们假设一个界面:
app.delete('/api/v1/users/:uid', function (req, res, next) {
...
}
Run Code Online (Sandbox Code Playgroud)
因此,使用该界面可以删除用户.
假设系统中有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
}
Run Code Online (Sandbox Code Playgroud)
有两件事需要考虑.一个是保护路由,从未经许可的人到该路由上的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)
}
Run Code Online (Sandbox Code Playgroud)
这将允许每个具有角色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
}
Run Code Online (Sandbox Code Playgroud)
我解决这个问题的方法是为每个用户创建一个角色。我使用猫鼬后保存挂钩:
acl.addUserRole(user._id, ['user', user._id]);
Run Code Online (Sandbox Code Playgroud)
然后在资源的后保存挂钩中,我执行以下操作:
acl.allow(['admin', doc.user._id], '/album/' + doc._id, ['*']);
acl.allow(['guest', 'user'], '/album/' + doc._id, ['get']);
Run Code Online (Sandbox Code Playgroud)
然后您可以使用该isAllowed方法检查是否req.user具有正确的权限。
| 归档时间: |
|
| 查看次数: |
2738 次 |
| 最近记录: |