我正在尝试使用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'的许可。资源
我还尝试检查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
返回的内容相冲突,所以我有点困惑。
是否有一个步骤我错过了我需要添加权限的位置?
答案 0 :(得分:0)
您必须在配置文件中调用该方法:
require('rout/of/your/policy/file').invokeRolesPolicies();
如果不这样做,总是会意外地返回false