【问题标题】:Uploaded files not publicly readable with ACL set使用 ACL 集上传的文件无法公开读取
【发布时间】:2013-06-12 20:31:33
【问题描述】:

我目前正在开发一个在 GAE 上运行的应用程序,该应用程序将接受图像上传,然后使用 GCS 客户端库将其写入存储空间(以前使用云存储 API 具有相同的结果)。我看到的问题是,在写入之后,只有在您已经使用 Google 帐户登录时才能访问这些文件。我启用了计费功能,并且我的 GAE id (XXXXXX@appspot.gserviceaccount.com) 作为团队成员作为所有者添加到 Google API 项目中

我使用了命令:gsutil setdefacl public-read gs://mybucket(实时代码中的存储桶名称是正确的)。

我的 ACL 中有以下条目:

<Entry>
  <Scope type="AllUsers"/>
    <Permission>
      READ
  </Permission>
</Entry>

我正在使用以下代码初始化写入:

GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename filename = new GcsFilename(bucket, fileName);
GcsFileOptions options = new GcsFileOptions.Builder()
  .mimeType(mime)
  .acl("public-read").build();
GcsOutputChannel writeChannel = gcsService.createOrReplace(filename, options);

应用程序将文件的 url 返回给客户端,正如我所提到的,这对任何 Google 用户都适用,但任何其他用户在尝试访问 https://storage.cloud.google.com/mybucket/filename.png url 时都会被重定向。此外,当我登录到云存储 Web 界面时,当我将鼠标悬停在“SHARED PUBLICLY”列中的框(其中有一个破折号)时,我会收到一条悬停消息“您无权查看或编辑此对象的ACL 的”。但是,我可以毫无问题地删除该文件,并且我登录的帐户被设置为 API 项目的所有者。

我确定我在这里遗漏了一些简单的东西,但我已经阅读了所有文档并且已经为此工作了几天。任何见解都值得赞赏。

【问题讨论】:

  • 您能否发布其中一个文件的结果 acl。另请注意,您可以通过 GAE 将文件直接上传到 Cloud Storage。见developers.google.com/appengine/docs/java/javadoc/com/google/…
  • 当我尝试通过 gsutil 检查 ACL 时,我得到了这个:$ ./gsutil getacl gs://mybucket/e7b2b0f2-d378-11e2-aa17-60b97f511988.png GSResponseError: status=403, code=AccessDenied, reason=Forbidden, detail=tclvpics/e7b2b0f2-d378-11e2-aa17-60b97f511988.png. 这似乎很奇怪,因为我是这个 API 项目的所有者,我什至重新运行 gsutil config 来仔细检查我是否在行动作为正确的用户
  • 我需要类似任务的帮助,请您查看stackoverflow.com/questions/17427931/…

标签: google-app-engine google-cloud-storage


【解决方案1】:

公开阅读问题

storage.cloud.google.com 域由 Cloud Storage UI 使用,只有登录用户才能访问。它不是 API 端点。您应该使用https://storage.googleapis.com/bucketname/objectnamehttps://bucketname.storage.googleapis.com/objectname

编辑 ACL 的权限被拒绝

只有对象上具有FULL_CONTROL 的用户或对象的所有者才能查看对象的 ACL。听起来该对象归您的服务帐户所有,而您的帐户在该对象上没有FULL_CONTROL,因此无法查看ACL。您仍然可以删除该对象,因为在存储桶上使用FULL_CONTROL 的用户始终可以删除存储桶中的对象。

【讨论】:

  • 哇,我不敢相信我错过了。非常感谢,就是这样。
  • 但根据 GCS 文档,“项目所有者和项目作者组对对象具有 FULL_CONTROL 权限。”所以用户“我登录的帐户被设置为API项目的所有者”。应该有权访问 ACL。对吗?
  • 仅当 ACL 是项目私有的某个子集时。例如,如果用户 A 上传了一个具有预定义 ACL“私有”的对象,则作为 BUCKET 所有者的用户 B 将能够删除该对象,但无法查看该对象或该对象的 ACL。
【解决方案2】:

相关说明:我认为您可以通过直接使用 blobstore API 将图像上传到 GCS 来降低 CPU 成本。 https://developers.google.com/appengine/docs/java/blobstore/#using-blobstore-with-gcs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多