parse.com继承了ACL +角色 - afterSave或beforeSave,棘手的场景

时间:2014-11-22 11:15:19

标签: parse-platform acl cloud-code before-save after-save

这是我想要实现的目标,但不知怎的,我被困住了,我不确定什么是正确的方法,我找不到任何这种情况的好例子,所以我正在寻求你的帮助。 / p>

每个注册用户都可以向课程" List"添加新对象。创建新项目后,我调用afterSave函数并分配正确的ACL来创建新角色(" membersOf _" + List.id)。接下来,用户可以将新对象添加到类" Items",它将存储List.id作为参考,并且项目的ACL应该从列表继承。列表和项目可以在他们选择的多个用户之间共享。在这种情况下几乎没有问题:

  • 创建新列表时,我需要创建新角色并为其分配创建者并将此角色添加到创建列表
  • 创建新项目时,我需要将List.id作为有效负载传递并使用云代码进行验证,如果当前用户可以通过首先检查他是否具有列表的适当权限来创建此类项目(分配给指定列表)
  • 如果权限检查没问题,我需要为此项目提供与List相同的ACL并继续保存

这是我的afterSave for List,正确创建角色并为ACL对象分配ACL。 (1)我错过了将此角色添加到用户(创建者)

Parse.Cloud.afterSave("List", function(request, response) {
    var list = request.object;
    var user = Parse.User.current();
    if (list.existed()) {
        // quit on update, proceed on create
        return;
    }
    var roleName = "membersOf_" + list.id;
    var listRole = new Parse.Role(roleName, new Parse.ACL(user));
    return listRole.save().then(function(listRole) {
        var acl = new Parse.ACL();
        acl.setPublicReadAccess(false);
        acl.setPublicWriteAccess(false);
        acl.setReadAccess(listRole, true);
        acl.setWriteAccess(listRole, true);
        var itemData = new Parse.Object("List", {
            ACL: acl
        });
        return itemData.save('objectId', list.id);
    });

    // to do - add user to this role too
});

这里是我的项目之前保存以验证用户是否可以实际创建这样的对象,我正在检查他是否可以查询列表,如果他得到> 0结果这样的列表意味着他可以添加分配给此列表的项目。 (2)缺少ACL继承

Parse.Cloud.beforeSave("Item", function(request, response) {
    var item = request.object;

    var listId = request.object.get("list");
    var user = Parse.User.current();

    var List = Parse.Object.extend("List");
    var query = new Parse.Query(List);
    query.equalTo("objectId", listId);

    query.first({
        success: function(list) {
            if (list.id) {
                response.success();
            }
            else {
                response.error('No such list or you don\'t have permission to perform this operation.');
            }
        },
        error: function(error) {
            response.error(error);
        }
    });
});

有人能指出我正确的解决方案或帮助解决这个难题吗?我错过了两件事: - (1)我需要将用户(创建者)添加到afterSave中创建的新角色 - (2)我需要向Item添加相同的ACL,从List对象继承它

我尝试过很多东西,在afterSave for Item中传递ACL,修改beforeSave中的有效负载。许多不同的功能遵循文档和不同的例子,但仍然没有运气。 任何建议都很棒!

1 个答案:

答案 0 :(得分:4)

好的,我想我终于搞清楚了。希望这将有助于将来的人。

这是最后的beforeSave和afterSave函数,将用户添加到指定的角色并为Item对象分配相同的ACL

Parse.Cloud.afterSave("List", function(request, response) {
    var list = request.object;
    var user = Parse.User.current();
    if (list.existed()) {
        // quit on update, proceed on create
        return;
    }
    var roleName = "membersOf_" + list.id;
    var listRole = new Parse.Role(roleName, new Parse.ACL(user));

//+ adding user to role in this line:
    listRole.relation("users").add(user);

    return listRole.save().then(function(listRole) {
        var acl = new Parse.ACL();
        acl.setPublicReadAccess(false);
        acl.setPublicWriteAccess(false);
        acl.setReadAccess(listRole, true);
        acl.setWriteAccess(listRole, true);
        var itemData = new Parse.Object("List", {
            ACL: acl
        });
        return itemData.save('objectId', list.id);
    });

    // to do - add user to this role too
});


Parse.Cloud.beforeSave("Item", function(request, response) {
    var item = request.object;

    var listId = request.object.get("list");
    var user = Parse.User.current();

// + modifying payload with the same ACL here
    var acl = new Parse.ACL();
    acl.setPublicReadAccess(false);
    acl.setPublicWriteAccess(false);
    acl.setRoleWriteAccess("membersOf_" + listId, true);
    acl.setRoleReadAccess("membersOf_" + listId,  true);
    item.set('ACL', acl);


    var List = Parse.Object.extend("List");
    var query = new Parse.Query(List);
    query.equalTo("objectId", listId);

    query.first({
        success: function(list) {
            if (list.id) {
                response.success();
            }
            else {
                response.error('No such list or you don\'t have permission to perform this operation.');
            }
        },
        error: function(error) {
            response.error(error);
        }
    });
});