8

在 Parse 中管理实体时,我需要将很多对象绑定到当前登录的用户。

我的担忧是:

  1. 没有后端代码确保User传入的是当前登录的用户。
  2. 用户可以将任何新创建的对象分配给其他用户。

他们有这个示例 TODO 应用程序,在文档中没有显示任何云代码,以确保分配给UserTodo是当前登录的用户。

现在我浏览了代码,我开始认为每当保存一个对象时,它都会与用户相关联。谁能解释为什么这个应用程序有效以及它是如何将Todos 与 s 关联起来的User

更新:没关系,我在他们的代码中找到了他们指定用户为 Todo 保存的位置。我的问题是,是什么阻止了用户编写使用其他人的用户 ID 保存待办事项的代码?

this.todos.create({
        content: this.input.val(),
        order:   this.todos.nextOrder(),
        done:    false,
        user:    Parse.User.current(),
        ACL:     new Parse.ACL(Parse.User.current())
      });

更新#2:如果User对象的ACL设置只允许用户能够读取User他们拥有的对象,那么他们将无法查询以获取另一个用户对象以传递。但是,还有另外两个可能的问题:

  1. User即使s 表user上的字段需要一个,他们是否可以传递用户的 objectId 而不是整个对象?Todo_User
  2. 我相信他们也可以创建一个新的用户对象并将其分配给它......我正在尝试考虑一个可能会成为问题的场景,但我现在不能。

如果有人可以确认或提供对其中任何一个有帮助的解决方案。现在要尝试测试#1。

更新#3——经过一些测试:

  1. 如果s 表user上的字段Todo需要_User对象,则不会将 objectId 作为字符串。
  2. 然而,他们可以创建一个新的用户对象并在那里设置 objectId 来解决这个问题。

    var user = new Parse.User();      // Create user object
    user.id = "cqmEuj1Bzf";           // Assign user id
    
    // Create and save Todo
    var td = new Todo();              
    td.set("name", "Some ting todo");
    td.set("user", user);
    td.save();
    

这正是我所担心的。只要我知道他们的 user_id ( ) ,我就能成功地将 Todo 保存到另一个用户的帐户。objectId有了足够多的用户,他们可能会猜到至少一个随机搞砸某人的帐户。

所以现在怎么办?

答:使用云码验证传入的用户是否与当前用户匹配。答案已发布在Parse 的论坛上

4

1 回答 1

1

您可以使用云代码来验证传入的用户是否与当前用户匹配。该答案已在此处的 Parse 论坛上发布。

您可以使用 Cloud Code 确保 objectId 对应于发出此请求的当前用户。事实上,我们的示例应用程序 Anypic 对“照片”和“活动”类进行了检查。

来自 Anypic 的云代码:

Parse.Cloud.beforeSave('Activity', function(request, response) {   var currentUser = Parse.User.current();    var objectUser = request.object.get('fromUser');

  if(!currentUser || !objectUser) {
    response.error('An Activity should have a valid fromUser.');   } else if (currentUser.id === objectUser.id) {
    response.success();   } else {
    response.error('Cannot set fromUser on Activity to a user other than the current user.');   } });

Parse.Cloud.beforeSave('Photo', function(request, response) {   var currentUser = Parse.User.current();    var objectUser = request.object.get('user');

  if(!currentUser || !objectUser) {
    response.error('A Photo should have a valid user.');   } else if (currentUser.id === objectUser.id) {
    response.success();   } else {
    response.error('Cannot set user on Photo to a user other than the current user.');   } });
于 2012-12-31T06:15:23.567 回答