【问题标题】:Why can't I set the ACL for a User to read: false + write:false?为什么我不能将用户的 ACL 设置为 read:false + write:false?
【发布时间】:2015-08-09 18:43:31
【问题描述】:

我正在尝试通过 REST API 创建一个新用户,并希望该对象只能由创建它的用户访问(读+写)。如果我在没有设置 ACL 的情况下创建用户,只设置用户名/密码,它会自动获取“公共读取,xxxx”,其中 xxxx 是 objectId。

如果我在 create user 调用中包含 ACL,它会默默地忽略该字段并为其提供相同的公共读取访问权限。

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

如果我在创建对象后尝试更新 ACL,我会得到:

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

然而,基于网络的数据浏览器会让我毫无怨言地撤销公共读取访问权限。知道发生了什么吗?

【问题讨论】:

    标签: parse-platform acl


    【解决方案1】:

    尝试使用云代码功能:

    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"}
    

    希望这会有所帮助。

    【讨论】:

    • 小问题:如果要为预定义的类添加触发器,则不应传入字符串作为类名,在此示例中,使用Parse.User 而不是"_User"
    【解决方案2】:

    实际上,您不需要以编程方式构建 ACL 以获得“仅主密钥”的正确行为,您只需指定一个空对象 ({})。调用方法来设置正确的参数是可行的,但它不能回答为什么会这样的问题。

    答案虽然烦人且不一致,但您可以以简写形式明确表示它,只需为 ACL 提供一个空对象或根本不提供任何对象。证明:

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

    输出:{}

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

    输出:{ '*': { read: true } }

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

    输出:{}

    请注意,取消设置公共读取访问权限会完全删除密钥,而不是将读取设置为 false。

    这使得以编程方式构建 ACL 变得很困难,因为您认为 { '*': { read: false, write: false} } 是等价的,但事实并非如此。

    只需提供ACL: {},它就可以正常工作。干杯。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-17
      • 2020-12-03
      • 2012-08-14
      相关资源
      最近更新 更多