【发布时间】:2016-04-15 23:45:53
【问题描述】:
我正在尝试使用 mongodb 实现 node-acl 并表达以允许控制每个文档,例如
- 用户查看所有文档
- 用户只能编辑/删除自己的文档。
我采用了这种方法:
-
当用户注册时,我使用 post save hook 创建用户并为其分配角色:
UserSchema.post('save', function(doc) { var roles = doc.roles || []; if (!roles.length) { roles = ['user']; } acl.addUserRoles(doc._id.toString(), roles, function(err) { console.log(err, 'added user'); }); }); -
现在用户已在系统中创建,他们现在可以创建行程了。和上面一样,我使用 post save 钩子将给定的权限添加到给定的用户对给定的资源:
TripSchema.post('save', function(trip) { acl.allow(trip.user.toString(), '/trips/' + trip._id, '*', function(err) { }); }); -
然后我使用一个自定义的简单中间件函数来检查给定用户是否可以访问具有给定权限的给定资源:
var middleware = function (req, res, next) { acl.isAllowed(req.user._id.toString(), req.path, ['put'], function (err, allow) { if (allow) { next() } res.status(403).send({}); }); };
但是,allow 始终为 false,我认为这可能与分配给用户的权限有关。
acl.whatResources(req.user._id.toString(), function (err, roles) {
console.log(err, roles);
// roles === { '/trips/56933aedc012523c352d3d85': [ 'put' ] }
});
从上面我可以假设用户对“/trips/56933aedc012523c352d3d85”资源拥有“put”权限
我还尝试检查areAnyRolesAllowed,如果任何给定角色具有正确的权限,它应该返回 true
acl.areAnyRolesAllowed( req.user._id.toString(), '/trips/56933aedc012523c352d3d85', 'put', function(err, allowed) {
console.log(err, allowed);
// allowed === true
});
这只会增加关于为什么isAllowed 总是返回 false 的困惑
最后我用allowedPermissions 做进一步检查,它返回给定用户访问给定资源的所有允许权限
acl.allowedPermissions(req.user._id.toString(), req.path, function (err, permissions) {
console.log(err, permissions);
// permissions === { '/trips/56933aedc012523c352d3d85': [] }
});
由此我们可以假设用户对该特定资源没有任何权限。为什么?它似乎与 whatResources 返回的内容冲突,所以我有点困惑。
我是否遗漏了需要添加权限的步骤?
【问题讨论】:
-
我已经设法让它按预期工作,但只有当我将用户 ID 作为角色传递给
addUserRoles时,这对我来说是错误的。这意味着每个用户都有自己的角色,可以吗?如果每个角色只有一个用户,这似乎违反了 ACL。
标签: node.js express mongoose permissions acl