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

parse-server set ACL for user and role in afterSave

我正在尝试为我的应用程序设置一个 "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));
    });
});

导致 ACL public read, user(write)(在仪表板中读取)。

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

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

谢谢。

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

  1. afterSave 中不需要响应,只有请求,所以你不需要写 response.success()
  2. 您为用户设置 ACL 但没有保存它时做得很好.. 如果您不 运行 保存 最后它会不保存您的更改,因此您需要使用 useMasterKey : true 运行 save 才能保存更改

最后您的代码应如下所示:

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));
    });

});