Почему я не могу настроить ACL для чтения пользователем: false + write: false?

Я пытаюсь создать нового пользователя через REST API и хочу, чтобы объект был доступен (читать + писать) только пользователю, который его создал. Если я создаю пользователя без установки ACL, устанавливая только имя пользователя/пароль, он автоматически получает "Public Read, xxxx", где xxxx - это objectId.

Если я включаю ACL с вызовом create user, он молча игнорирует это поле и дает ему тот же доступ для открытого доступа.

{"username":"dummyUsersname","ACL":{"*":{"write":false,"read":false}},"password":"dummyPassword"}

Если я попытаюсь обновить ACL после создания объекта, я получаю:

code: 123 error: Invalid acl {"*":{"read":false,"write":false}}

И все же веб-браузер данных позволит мне отменить открытый доступ для чтения без жалоб. Любая идея, что происходит?

Ответ 1

Попробуйте использовать функцию Cloud Code:

Parse.Cloud.beforeSave(Parse.User, function(request, response) {
    var acl = new Parse.ACL();
    acl.setPublicReadAccess(false);
    acl.setPublicWriteAccess(false);

    request.object.setACL(acl);
    response.success();
});

При его использовании запросите

curl -X POST \
  -H "X-Parse-Application-Id: <app_id>" \
  -H "X-Parse-REST-API-Key: <rest_api_key>" \
  -H "X-Parse-Revocable-Session: 1" \
  -H "Content-Type: application/json" \
  -d '{"username":"cooldude6","password":"p_n7!-e8","phone":"415-392-0202"}' \
  https://api.parse.com/1/users

... возвращает:

{"ACL":{"adItsbPH0a":{"read":true,"write":true}},"createdAt":"2015-08-13T10:10:09.591Z","objectId":"adItsbPH0a","phone":"415-392-0202","sessionToken":"r:otH4qsd2zmBG4tTj4ePoGSFVE","username":"cooldude6"}

Надеюсь, что это поможет.

Ответ 2

На самом деле вам не нужно создавать ACL программно, чтобы получить правильное поведение для "основного ключа" здесь, вам просто нужно указать пустой объект ({}). Вызов методов для установки правильных параметров работает, но он не отвечает на вопрос, почему это так.

Ответ, хотя и раздражающий и непоследовательный, заключается в том, что вы CAN явно отображаете его в сокращенной форме, просто предоставляя пустой объект для ACL или вообще никакого объекта. Доказательство:

var acl = new Parse.ACL();
acl.toJSON();

Выход: {}

acl.setPublicReadAccess(true);
acl.toJSON();

Выход: { '*': { read: true } }

acl.setPublicReadAccess(false);
acl.toJSON();

Выход: {}

Обратите внимание, что при отключении общедоступного доступа к чтению полностью удаляется ключ, вместо того, чтобы считать чтение ложным.

Это затрудняет программную сборку ACL, потому что вы думаете, что { '*': { read: false, write: false} } будет эквивалентным, но это не так.

Просто укажите ACL: {}, и он будет работать нормально. Приветствия.