Почему я не могу настроить 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: {}
, и он будет работать нормально. Приветствия.