【问题标题】:parse.com inherited ACL + roles - afterSave or beforeSave, tricky scenarioparse.com 继承 ACL + 角色 - afterSave 或 beforeSave,棘手的场景
【发布时间】:2014-11-22 11:15:18
【问题描述】:

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

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

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

这是我对 List 的 afterSave,正确创建角色并将 ACL 分配给 List 对象。 (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
});

这是我的 Item beforeSave 以验证用户是否可以实际创建这样的对象,我正在检查他是否可以查询 List 表,如果他为此类 List 获得 >0 结果,这意味着他可以添加分配给此的 Item列表。 (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 中为 Item 传递 ACL,在 beforeSave 中修改有效负载。遵循文档和不同示例的许多不同功能,但仍然没有运气。 任何建议都会很棒!

【问题讨论】:

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


    【解决方案1】:

    好吧,我想我终于想通了。希望这对将来的人有所帮助。

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

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

    【讨论】:

    • 嗨@lokers,其他方式是调用'var acl = list.getACL(); itemData.setACL(acl);'
    猜你喜欢
    • 2012-06-05
    • 2018-07-07
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多