2014-11-22 56 views
2

这里就是我想实现但不知何故,我坚持,我不知道什么是正确的做法,我找不到这样的情况下任何好的例子,所以我我正在寻求你的帮助。parse.com继承的ACL +角色 - afterSave或beforeSave,棘手的场景

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

  • 创建新表时,我需要创建新的角色和分配创建者,并创建列表中添加这种角色
  • 创建新项目的时候,我需要通过名单.ID作为有效载荷,并通过第一检查与云代码验证,如果当前用户可以创建这样的项目(分配到指定的目录),如果他有适当的权限列出
  • 如果权限检查是确定的,我需要给这个项目相同的ACL如清单已与节约

继续这里是我的afterSa适用于List,正确创建角色并将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 
}); 

这里是我的项目beforeSave来验证,如果用户实际上可以创建这样的对象,我检查他是否可以查询目录表,如果他得到> 0这样的List的结果意味着他可以添加分配给此列表的项目。 (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)我需要将相同的ACL添加到项目,从List对象

我继承它尝试了很多事情,在afterSave中传递ACL后,在beforeSave中修改有效载荷。许多不同的功能遵循文档和不同的例子,但仍然没有运气。 任何建议都会很棒!

回答

4

好吧,我想我终于明白了。希望这将有助于未来的人。

这里是最终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); 
     } 
    }); 
}); 
+0

喜@lokers,其它的方法是将所说的“VAR ACL = list.getACL(); itemData.setACL(ACL);” – matus 2015-01-04 22:49:09