我正在使用JSON API Java库将对象上传到Google Cloud Storage。我已经弄清楚了如何添加具有角色READER的实体allUsers以获取公共访问权,但是我尝试添加到ObjectAccessControl列表中的任何其他实体/角色条目都会产生一些通用错误,例如
com.google.api.client.googleapis.json.GoogleJsonResponseException:400错误的请求
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Invalid Value",
"reason" : "invalid"
}
...对于我拥有的每个ACL条目,除了allUsers READER似乎有效
我不确定它在抱怨什么。我试图重现在开发人员控制台中看到的默认权限,即当我未在元数据上指定任何ACL时。owner-projectId所有者,editers-projectId所有者,viewers-projectId阅读器和用户ID所有者(我猜这是服务帐户ID)
我将这些添加到ACL列表的方式与allUsers实体相同。我搜索了几个小时,试图找到一些文档或与此类似的问题,但只找到了一个与allUsers有关的文档。我尝试转义这些ID,以为JSON库可能对我而言不是这样做,但会出现相同的错误。
这是我相关的Java代码:
// Set permissions and content type on StorageObject metadata
StorageObject objectMetadata = new StorageObject();
// set access control
List<ObjectAccessControl> acl = Lists.newArrayList();
acl.add(new ObjectAccessControl().setEntity("allUsers").setRole("READER"));
// this one allows upload to work without error if it is the only access specified,
// but prevents me from modifying publicly available status or editing permissions
// via the developers console (I think this is to be expected)
// attempt to replicating bucket defaults...
// adding any of these will cause the error
acl.add(new ObjectAccessControl().setEntity("owners-projectId").setRole("OWNER"));
acl.add(new ObjectAccessControl().setEntityId("editors-projectId").setRole("OWNER"));
acl.add(new ObjectAccessControl().setEntityId("viewers-projectId").setRole("READER"));
objectMetadata.setAcl(acl);
其中projectId是我从开发者控制台站点复制的项目ID。
终于明白了。
我首先怀疑我的DEVSTORAGE_READ_WRITE的存储范围不够,然后尝试了DEVSTORAGE_FULL_CONTROL,但这不是原因。
也请忽略我在原始帖子中对setEntityId(...)的使用,尽管这也是我也没有尝试过的事情。
问题是实体参数中的语法不正确。您需要的文档是这样的:https : //cloud.google.com/storage/docs/json_api/v1/defaultObjectAccessControls
然后,您将看到正确的方法如下所示:
acl.add(new ObjectAccessControl().setEntity("project-owners-projectId").setRole("OWNER"));
奇怪的是,这不起作用:
acl.add(new ObjectAccessControl().setProjectTeam(new ProjectTeam().setProjectNumber("projectId").setTeam("owners")).setRole("OWNER"));
我怀疑设置项目团队实体的方法是Java库中的错误,但我不确定。
对于不正确实体的错误消息,总是说需要“域全局”或“域全局无效”,这根本不是很有启发性的。在这种情况下,不需要设置域。另请参见以下内容的讨论:插入对象时,ACL定义中Google Cloud Storage期望哪个域?
希望这可以帮助其他人!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句