Разрешения Parse Pointer не позволяют создавать

Я выполнил каждый шаг это прохождение, но когда я пытаюсь создать новую строку, я получаю 403:

code: 119

message: "Этот пользователь не может выполнять создание операции над сообщениями. Вы можете изменить этот параметр в окне" Браузер данных".

Мой код:

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 устанавливаются следующим образом: введите описание изображения здесь введите описание изображения здесь

Похоже, что кто-то еще разместил ту же проблему в группе google. Что нам не хватает?

Ответ 1

Я представил это как ошибку в Parse (Facebook), и они ответили:

Нам удалось воспроизвести эту проблему, и она кажется действительной ошибкой. Мы назначаем это соответствующей команде.

Я обновлю этот ответ, как только проблема будет решена. Если эта проблема влияет на вас, подпишитесь на ошибку, так как это поможет определить приоритет исправления.

UPDATE

Facebook ответил:

Оказывается, это на самом деле по дизайну. Чтобы создать объект, класс должен иметь общедоступные разрешения на создание

К сожалению, с этим решением я могу создать сообщение "от" любого другого пользователя (другого пользователя, установленного как sender). Это неприемлемо и неприемлемо ИМХО.

Ответ 2

Это было ошибкой с момента запуска Pointer Permissions, что фактически делает их бесполезными. У меня сложилось впечатление, что они построили это с идеей позволить разработчикам безопасно использовать существующие схемы за один раз, но, конечно, вам нужно, чтобы они работали для будущего создания.

Одним из способов решения проблемы было бы объединение более старых разрешений на уровне классов и ACL каждой строки, если вы не отключите свой браузер данных. Предположим, у вас есть классы "Puppy" и "Cat", и у обоих есть поле под названием "владелец".

  • В вашем браузере данных для каждого класса, где имеет смысл иметь поле владельца, вы устанавливаете свои разрешения на уровне класса для щенка и кота каждый:

Публикация - Чтение: Да или Нет, зависит от вашего варианта использования, Запись: Да

Добавить разрешение указателя для "владельца" - Чтение: Да, Запись: Да (можно пропустить это сейчас, см. ниже)

  1. Затем в вашем облаке /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');

Ответ 3

К сожалению, похоже, что разрешения Parse Pointer не работают, как вы ожидаете, на Create. Быстрое исправление будет состоять в том, чтобы разрешить разрешение Create для общего доступа. Затем убедитесь, что пользователь, создающий запись, совпадает с sender. Поэтому вам необходимо выполнить ручную проверку триггера beforeSave для класса Messages в облачном коде, и если эта проверка завершится неудачно, отклоните создаваемую запись.