在GCS存储桶上允许公共读取访问?

49
我试图允许匿名访问(或仅来自我的应用程序域)从我的存储桶中读取文件。
尝试读取这些文件时,我得到以下错误:

```

<Error>
    <Code>AccessDenied</Code>
    <Message>Access denied.</Message>
    <Details>
        Anonymous users does not have storage.objects.get access to object.
    </Details>
</Error>

我还尝试在Google Cloud控制台的默认权限对话框中添加域名。然而,这给了我一个错误:“您的权限之一无效。请确保为组和用户输入经过授权的ID或电子邮件,为域输入域。”

我还考虑将存储桶的ACL设置为public-read。但是,我的唯一问题是这会删除我对存储桶的所有权。我需要拥有所有权,因为我想允许从特定的Google Access Id上传文件。

7个回答

50

您还可以从控制台中进行操作。
https://console.cloud.google.com/storage/
选择编辑存储桶权限:
在“添加成员”选项中输入“allUsers”,并将角色设置为“Storage Object Viewer”。 然后进入“选择角色”并将“Storage”和“Storage Object Legacy”设置为“Storage Object View”。

GCS bucket access


1
是的,天哪!它说它正在使用统一权限,并且存储桶是公共的,但是不起作用。必须添加“allUsers”并提供查看选项。 - CpILL

46

您可以使用 gsutil 工具使存储桶中新创建的对象对公众可读,同时不会影响您的所有权。要使存储桶中新创建的对象对公众可读,请执行以下操作:

gsutil defacl ch -u AllUsers:R gs://yourbucket

如果您已经有一些现有的对象在存储桶中,并且希望使它们对公众可读,则可以运行以下命令:

gsutil acl ch -u AllUsers:R gs://yourbucket/**


谢谢。那限制到一个域名怎么样? - Jordan Arsenault
您可以使用域名:请参阅“gsutil help acl ch”。特别是,请查看以下部分:组也可以指定为完整域,例如“-g my-company.com:r”。 - Travis Hobrla

12

使用 IAM 角色,使文件可读,并阻止列示:

gsutil iam ch allUsers:legacyObjectReader gs://bucket-name
为了使文件可读并允许列出:
gsutil iam ch allUsers:objectViewer gs://bucket-name

使用IAM相比ACL有什么好处吗?我还不熟悉它们的区别。 - akauppi
3
此外,由于这是 Google 推荐的方法,您可以提供链接:https://cloud.google.com/storage/docs/access-control/making-data-public#buckets - akauppi

8
  1. 在Google Cloud Platform Console中打开Cloud Storage浏览器。
  2. 在存储桶列表中,单击包含您想要公开的对象的存储桶的名称,并在子目录中导航到该对象(如果它在子目录中)。
  3. 单击与您要公开的对象相关联的下拉菜单。
  4. 下拉菜单显示为对象行最右侧的三个竖点。
  5. 从下拉菜单中选择“编辑权限”。
  6. 在出现的覆盖层中,单击“+添加项目”按钮。
  7. 为allUsers添加权限。

    • 为实体选择“User”。
    • 输入名称“allUsers”。
    • 选择访问级别“Reader”。
    • 单击“保存”。
  8. 一旦公开共享,公共访问列中会出现一个链接图标。 您可以单击此图标以获取对象的URL。

来自Google Cloud Docs的使数据公开说明。


3
如果在 firebase 函数中上传文件,您需要在引用对象上调用 makePublic() 方法,以便使其无需传递令牌即可访问。

1

2022年4月更新:

您可以允许所有用户在云存储中读取您的存储桶中的文件。

首先,在存储桶详情中,单击“权限”,然后单击“添加”

enter image description here

然后,输入"allUsers"

enter image description here

然后,选择“存储遗留对象读取器”角色,以便所有用户都可以读取文件:

enter image description here

然后,点击"保存"

enter image description here

接下来,您应该会看到如下所示的提示,请点击“允许公共访问”

enter image description here

最后,您可以允许所有用户读取存储桶中的文件:

enter image description here


0
如果您想允许特定的存储桶与特定的“文件夹/内容”可访问,则必须在命令中指定: gsutil iam -r ch allUsers:legacyObjectReader gs://your-bucket/your-files/** 但这仅适用于不公开的存储桶中的特定内容!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接