为什么我不能为用户设置 ACL 以读取:false + write:false?
Why can't I set the ACL for a User to read: false + write:false?
我正在尝试通过 REST 创建一个新用户 API,并希望该对象只能由创建它的用户访问(读+写)。如果我在不设置 ACL 的情况下创建用户,仅设置 username/password,它会自动获得 "Public Read, xxxx",其中 xxxx 是 objectId。
如果我在创建用户调用中包含一个 ACL,它会默默地忽略该字段并为其提供相同的 public 读取访问权限。
{"username":"dummyUsersname","ACL":{"*":{"write":false,"read":false}},"password":"dummyPassword"}
如果我在创建对象后尝试更新 ACL,我得到:
code: 123 error: Invalid acl {"*":{"read":false,"write":false}}
然而,基于网络的数据浏览器会让我毫无怨言地撤销 public 读取权限。知道发生了什么吗?
尝试使用 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
...returns:
{"ACL":{"adItsbPH0a":{"read":true,"write":true}},"createdAt":"2015-08-13T10:10:09.591Z","objectId":"adItsbPH0a","phone":"415-392-0202","sessionToken":"r:otH4qsd2zmBG4tTj4ePoGSFVE","username":"cooldude6"}
希望对您有所帮助。
实际上,您不需要以编程方式构建 ACL 以获得此处 "master key only" 的正确行为,您只需指定一个空对象 ({}) 即可。调用方法来设置正确的参数有效,但它没有回答为什么会这样的问题。
答案虽然烦人且不一致,但您 可以 通过为 ACL 提供一个空对象或不提供任何对象,以 shorthand 形式明确表示它根本。证明:
var acl = new Parse.ACL();
acl.toJSON();
输出:{}
acl.setPublicReadAccess(true);
acl.toJSON();
输出:{ '*': { read: true } }
acl.setPublicReadAccess(false);
acl.toJSON();
输出:{}
请注意,取消设置 public 读取权限会完全删除密钥,而不是将读取设置为 false。
这使得以编程方式建立 ACL 变得困难,因为您认为 { '*': { read: false, write: false} }
是等效的,但事实并非如此。
只需提供 ACL: {}
即可。干杯。
我正在尝试通过 REST 创建一个新用户 API,并希望该对象只能由创建它的用户访问(读+写)。如果我在不设置 ACL 的情况下创建用户,仅设置 username/password,它会自动获得 "Public Read, xxxx",其中 xxxx 是 objectId。
如果我在创建用户调用中包含一个 ACL,它会默默地忽略该字段并为其提供相同的 public 读取访问权限。
{"username":"dummyUsersname","ACL":{"*":{"write":false,"read":false}},"password":"dummyPassword"}
如果我在创建对象后尝试更新 ACL,我得到:
code: 123 error: Invalid acl {"*":{"read":false,"write":false}}
然而,基于网络的数据浏览器会让我毫无怨言地撤销 public 读取权限。知道发生了什么吗?
尝试使用 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
...returns:
{"ACL":{"adItsbPH0a":{"read":true,"write":true}},"createdAt":"2015-08-13T10:10:09.591Z","objectId":"adItsbPH0a","phone":"415-392-0202","sessionToken":"r:otH4qsd2zmBG4tTj4ePoGSFVE","username":"cooldude6"}
希望对您有所帮助。
实际上,您不需要以编程方式构建 ACL 以获得此处 "master key only" 的正确行为,您只需指定一个空对象 ({}) 即可。调用方法来设置正确的参数有效,但它没有回答为什么会这样的问题。
答案虽然烦人且不一致,但您 可以 通过为 ACL 提供一个空对象或不提供任何对象,以 shorthand 形式明确表示它根本。证明:
var acl = new Parse.ACL();
acl.toJSON();
输出:{}
acl.setPublicReadAccess(true);
acl.toJSON();
输出:{ '*': { read: true } }
acl.setPublicReadAccess(false);
acl.toJSON();
输出:{}
请注意,取消设置 public 读取权限会完全删除密钥,而不是将读取设置为 false。
这使得以编程方式建立 ACL 变得困难,因为您认为 { '*': { read: false, write: false} }
是等效的,但事实并非如此。
只需提供 ACL: {}
即可。干杯。