Node-acl方法" isAllowed"总是意外地返回false

时间:2016-01-11 15:38:09

标签: node.js express mongoose permissions acl

我正在尝试使用mongodb实现node-acl并表达以允许控制每个文档,例如

  • 用户查看所有文档
  • 用户只能编辑/删除自己的文件。

我采用了这种方法:

  1. 当用户注册时,我使用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');
        });
    });
    
  2. 现在已经在系统中创建了用户,他们现在可以创建一个旅行了。如上所述,我使用post save钩子在给定资源上向给定用户添加给定权限:

    TripSchema.post('save', function(trip) {
        acl.allow(trip.user.toString(), '/trips/' + trip._id, '*', function(err) {
    
        });
    });
    
  3. 然后我使用自定义的简单中间件函数来检查给定用户是否可以访问具有给定权限的给定资源:

    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({});
    
        });
    
    };
    
  4. 但是,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返回的内容相冲突,所以我有点困惑。

    是否有一个步骤我错过了我需要添加权限的位置?

1 个答案:

答案 0 :(得分:0)

您必须在配置文件中调用该方法:

require('rout/of/your/policy/file').invokeRolesPolicies();

如果不这样做,总是会意外地返回false