解析指针权限不允许创建

时间:2015-10-23 16:50:23

标签: javascript security parse-platform

我已经跟随this walkthrough的每一步,但是当我尝试创建一个新行时,我得到了403:

  

代码:119

     

消息:"不允许此用户执行创建   对消息的操作。您可以在数据浏览器中更改此设置。"

我的代码:

Messages = Parse.Object.extend("Messages")
var message = new Messages();
message.set("sender", Parse.User.current());
message.set("receiver", *anotherUser*);
message.set("subject", "foo")
message.set("body", "bar")
message.save()
.then(
  function(message){
    console.log("success!")
  },function(error){
    console.log("error: ", error);
});

我的CLP设置如下: enter image description here enter image description here

看起来其他人发布了the same issue in a google group。我们缺少什么?

3 个答案:

答案 0 :(得分:16)

我已将此作为a bug提交给Parse(Facebook),他们回复说:

  

我们设法重现了这个问题,它似乎是一个有效的错误。我们将此分配给相应的团队。

问题解决后,我会更新此答案。 如果此问题影响了您,请订阅该错误,因为这有助于确定修复的优先顺序。

更新

Facebook回复:

  

事实证明这实际上是设计上的。要创建对象,该类应具有公共创建权限

不幸的是,通过这个解决方案,我可以“从”任何其他用户创建一条消息(另一个用户设置为sender)。这是不可接受的,无法使用恕我直言。

答案 1 :(得分:6)

自指针权限启动以来,这一直是一个错误,这有效地使它们变得毫无用处。我的印象是他们建立了这个想法,让开发人员一次性保护现有的模式,但当然你需要它来为将来的创作工作。

一种解决方法是将较旧的类级别权限与每行ACL相结合,同时小心不要禁用数据浏览器。让我们假设你有课程" Puppy"和#34; Cat"并且都有一个名为" owner"。

的字段
  1. 在您的数据浏览器中,对于拥有所有者字段的每个类,您可以将Puppy和Cat的类级别权限设置为:
  2. 公开 - 阅读:是或否,取决于您的使用案例,写信:是

    为"所有者" 添加指针许可 - 阅读:是,写:是(现在可以跳过此处,见下文)

    1. 然后在您的cloud / main.js中,您可以使用以下内容作为起点(我经常称之为"类型"下面,抱歉)。

    2. 当Parse修复​​了创建问题时,删除了Public Write Class Level权限(上面),保留指针权限,并删除下面的变通方法代码。

    3. -

      var validateAndUpdateOwnerWritePerms = function(request){
          var object = request.object;
          var error = null;
          var owner = object.get('owner');
      
          if (!Parse.User.current()) {
              error = 'User session required to create or modify object.';
          } else if (!owner) {
              error = 'Owner expected, but not found.';
          } else if (owner && owner.id != Parse.User.current().id && !object.existed()) {
              error = 'User session must match the owner field in the new object.';
          }
      
          if (request.master) {
              error = null;
          }
      
          if (error) {
              return error;
          }
      
          if (object.existed()) {
              return null;
          }
      
          var acl = new Parse.ACL();
          acl.setReadAccess(owner, true);
          acl.setWriteAccess(owner, true);
      
          object.setACL(acl);
      
          return null;
      }
      
      // Wrapper that makes beforeSave, beforeDelete, etc. respect master-key calls.
      // If you use one of those hooks directly, your tests or admin
      // console may not work.
      var adminWriteHook = function(cloudHook, dataType, callback) {
          cloudHook(dataType, function(request, response) {
              if (request.master) {
                  Parse.Cloud.useMasterKey();
              } else {
                  var noUserAllowed = false;
                  if (cloudHook == Parse.Cloud.beforeSave &&
                      (dataType == Parse.Installation || dataType == Parse.User)) {
                          noUserAllowed = true;
                  }
                  if (!noUserAllowed && !Parse.User.current()) {
                      response.error('Neither user session, nor master key was found.');
                      return null;
                  }
              }
      
              return callback(request, response);
          });
      };
      
      // Set hooks for permission checks to run on delete and save.
      var beforeOwnedTypeWriteHook = function(type) {
          var callback = function (request, response) {
              var error = validateAndUpdateOwnerWritePerms(request);
              if (error) {
                  response.error(error);
                  return;
              }
              response.success();
          };
          return adminWriteHook(Parse.Cloud.beforeSave, type, callback);
          return adminWriteHook(Parse.Cloud.beforeDelete, type, callback);
      };
      
      beforeOwnedTypeWriteHook('Puppy');
      beforeOwnedTypeWriteHook('Cat');
      

答案 2 :(得分:2)

不幸的是,Parse Pointer Permissions似乎无法按预期在Create上运行。快速解决方案是允许Create权限公开。然后确保创建记录的用户与sender相同。因此,您需要在云代码中beforeSave类的Messages触发器中执行手动检查,如果检查失败,请拒绝正在创建的记录。