我正在尝试使用 mongodb 和 express 实现 node-acl 以允许控制每个文档,例如
- 用户查看所有文档
- 用户只能编辑/删除自己的文档。
我采取了这种方法:
-
当用户注册时,我使用保存后钩子创建一个用户并为其分配角色:
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
总是错误的,我认为这可能与为用户分配的权限有关。
acl.whatResources(req.user._id.toString(), function (err, roles) {
console.log(err, roles);
// roles === { '/trips/56933aedc012523c352d3d85': [ 'put' ] }
});
从上面我可以假设用户对"/trips/56933aedc012523c352d3d85"资源具有"放置"权限
我还尝试检查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
返回的内容冲突,所以我有点困惑。
我是否错过了需要添加权限的步骤?
您必须在配置文件中调用该方法:
require('rout/of/your/policy/file').invokeRolesPolicies();
如果你不这样做,总是意外返回假