parse-server为afterSave中的用户和角色设置ACL

时间:2016-08-04 23:00:29

标签: acl roles cloud-code parse-server

我正在尝试为我的应用设置“general_user”角色,因此管理员可以通过从该角色中删除用户来禁止用户。

此代码:

Parse.Cloud.afterSave(Parse.User, function(request, response) {
var user = request.object;
if (user.existed()) { return; }

var roleQuery = new Parse.Query(CONSTANTS.ROLE_CLASSNAME);
roleQuery.equalTo("name", CONSTANTS.GENERAL_USER_ROLENAME);
roleQuery.first(CONSTANTS.USE_MASTER_KEY)
    .then(function(generalUserRole) {
        if(generalUserRole)
        {
            generalUserRole.getUsers().add(user);
            return generalUserRole.save();
        }
        else
        {
            var role = new Parse.Role(CONSTANTS.GENERAL_USER_ROLENAME, new Parse.ACL());
            role.getUsers().add(user);
            return role.save();
        }
    }).then(function(generalUserRole) {
        var acl = new Parse.ACL();
        acl.setWriteAccess(user, true);
        acl.setRoleReadAccess(generalUserRole, true);
        req.object.setACL(acl);
    },
    function(error) {
        console.log(JSON.stringify(error));
    });
});

结果在public read, user(write)的ACL中(在仪表板中读取)。

我在添加ACL后尝试保存req.object的保存。

我尝试过使用和不使用res.success()(我明白在afterSaves中没有必要)。

谢谢。

1 个答案:

答案 0 :(得分:1)

我测试了你的代码,发现了一些问题并修复了它们。我发现的问题是:

  1. 只有请求 afterSave 后才需要响应,因此您无需编写response.success()
  2. 当您为用户设置ACL但没有保存时​​,您做得很好..如果您不在最后运行保存,则无法保存您的更改,因此您需要使用 useMasterKey:true 运行保存以保存更改
  3. 最后,您的代码应如下所示:

    Parse.Cloud.afterSave(Parse.User, function (req) {
    
        var user = req.object;
        if (user.existed()) { return; }
    
        var roleQuery = new Parse.Query(Parse.Role);
        roleQuery.equalTo("name", "someRole");
    
        roleQuery.first({ useMasterKey: true }).then(function (role) {
    
            if (role) {
                role.getUsers().add(user);
                return role.save();
            } else {
                var myNewRole = new Parse.Role("someRole", new Parse.ACL());
                myNewRole.getUsers().add(user);
                return myNewRole.save()
            }
    
        }).then(function (userRole) {
            var acl = new Parse.ACL();
            acl.setWriteAccess(user, true);
            acl.setRoleReadAccess(userRole, true);
            user.setACL(acl);
            return user.save(null,{ useMasterKey: true });
        }, function (error) {
            console.log(JSON.stringify(error));
        });
    
    });