【问题标题】:google cloud storage - I can't edit the permissions of my objects even though I am the project owner谷歌云存储 - 即使我是项目所有者,我也无法编辑对象的权限
【发布时间】:2022-01-23 03:55:18
【问题描述】:

我使用以下 Java 代码将对象添加到具有公共读取权限的谷歌云存储,以便任何人都可以读取该文件:

try {
     gcsService.createOrReplace(file, new GcsFileOptions.Builder()
                            .mimeType("image/jpeg")
                            .acl("public-read").build(),
                            ByteBuffer.wrap(data));
        } catch (IOException ex){
            // catch error
        }

但是当我在 GCP 控制台中访问云存储时,如果我尝试编辑文件的权限,我会收到此通知以及此错误:

由于您无权了解本网站的公开访问状态 对象,显示的公共 URL 可能无效。

当我将文件写入云存储时,我可以做些什么,这样它既具有公共读取权限,又允许我,项目所有者,有权编辑它的权限?

当我是项目所有者时,我无法编辑自己对象的权限,这似乎有点愚蠢。

编辑:

我也在考虑使用新的云存储 API。这是我到目前为止的代码。我怎样才能使 ACL 为项目所有者(我)所用,并使其可公开阅读?

Storage storage = StorageOptions.getDefaultInstance().getService();

BlobId blobId = BlobId.of(bucket, object);

BlobInfo blobInfo = BlobInfo.newBuilder(blobId)
        .setContentType(mimeType)
        .setAcl(Arrays.asList(Acl.of(Acl.User.ofAllUsers(), READER)))
        .build();

Blob output = storage.create(blobInfo, data);

【问题讨论】:

  • 嗨,BlueBoy。你在这方面有什么进展吗?我试图在下面提供答案。你有没有机会检查一下,这有意义吗?如果我的回答有用,请点击它左侧的点赞按钮 (▲)。如果它回答了您的问题,请单击复选标记 (✓) 接受它。这样其他人就知道你得到了(足够的)帮助
  • @PriyashreeBhadra 这并没有真正帮助,因为我正在寻找 Java 中的代码解决方案,而不仅仅是权限如何工作的广泛描述。您的回答听起来更像是文档,而不是获取我在问题中编写的代码并从中添加/减去以使其工作。不过谢谢!
  • 感谢您指出您真正需要的是“为项目所有者(您)制作 ACL 并使其可公开阅读的代码?”。我将分享一个GitHub comment link,我认为这会对您有所帮助。
  • 关注它提到storage.create(coverBlob, coverImage, BlobTargetOption.predefinedAcl(PredefinedAcl.PUBLIC_READ))的地方;将预定义的 ACL 设置为 PUBLIC_READ。 PUBLIC_READ 预定义 ACL 对应于设置以下权限:Object owner gets OWNER accessallUsers get READER access.acl(Arrays.asList(Acl.of(User.ofAllUsers(), Role.READER))) 只需设置以下权限即可为 blob 设置 ACL:allUsers get READER access
  • 另外,这里是code,您可以在其中授予所有者访问单个用户帐户或所有项目所有者的权限。让我知道它是否对您有用。我想改进我的答案,使其看起来不像文档,并且与您的答案更相关。祝你有美好的一天!

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


【解决方案1】:

storage.buckets.getIamPolicy 用于读取存储桶 IAM 策略,storage.buckets.setIamPolicy 用于更新存储桶 IAM 策略。 The storage.objects.getIamPolicy and storage.objects.setIamPolicy 权限不适用于启用了uniform bucket-level access 的存储桶。因此,当您对存储桶启用统一的存储桶级别访问权限时,访问控制列表 (ACL) 将被禁用,并且只有存储桶级别的身份和访问管理 (IAM) 权限授予对该存储桶及其包含的对象的访问权限。因此,首先检查您在使用various options to view bucket metadata 创建存储桶时是否为您的存储桶启用了uniform bucket-level access / fine-grained permissions(XML API 除外)

对 GCS 资源的访问不是递归的。拥有一个项目或该项目中的存储桶并不一定意味着您也对特定对象具有某些权限。拥有存储桶确实意味着您可以列出或删除该对象,但仅此而已。 确定哪些内置 IAM 角色可以执行哪些操作的最佳资源是 Google Cloud Platform IAM Permissions Reference。 在该页面上,按 CTRL-F 获取您感兴趣的其他权限,您将在右侧列中看到授予该权限的角色。请注意,项目所有者(角色/所有者)不在授予此权限的角色列表中。

关于如何使单个对象公开可读,请参阅Java code sample in documentation。同样,如果您的存储桶使用uniform bucket-level access,则不能使用这些步骤。相反,授予public readability to all objects in the bucket,或使用signed URLs。也许这就是您收到错误的原因,因为您对存储桶具有统一的存储桶级别访问权限,并且您正在尝试不可能的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2018-08-17
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多