解析指针权限不允许创建

ada*_*ort 10 javascript security parse-platform

我已经完成了本演练的每一步,但是当我尝试创建一个新行时,我得到了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);
});
Run Code Online (Sandbox Code Playgroud)

我的CLP设置如下: 在此输入图像描述 在此输入图像描述

看起来其他人在Google群组中发布了相同的问题.我们缺少什么?

ada*_*ort 16

我已将此作为错误提交给Parse(Facebook),他们回答说:

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

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

UPDATE

Facebook回复:

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

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


小智 6

自从Pointer Permissions推出以来,这一直是一个错误,这有效地使它们无用.我的印象是他们建立了这个想法,让开发人员一次性保护现有的模式,但当然你需要它来为将来的创作工作.

一种解决方法是将较旧的类级别权限与每行ACL相结合,同时小心不要禁用数据浏览器.假设您有"Puppy"和"Cat"类,并且都有一个名为"owner"的字段.

  1. 在您的数据浏览器中,对于拥有所有者字段的每个类,您可以将Puppy和Cat的类级别权限设置为:

公开 - 阅读:是或否,取决于您的使用案例,写:是的

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

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

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

-

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');
Run Code Online (Sandbox Code Playgroud)