当前位置: 首页 > 知识库问答 >
问题:

谷歌云存储-即使我是项目所有者,我也无法编辑我的对象的权限

公孙河
2023-03-14

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

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);

共有1个答案

柯永福
2023-03-14

存储。铲斗。getIamPolicy用于读取bucket IAM策略和存储。铲斗。setIamPolicy用于更新bucket IAM策略。仓库。对象。getIamPolicy和storage。对象。setIamPolicy权限不适用于启用了统一存储桶级别访问的存储桶。因此,当您对一个bucket启用统一的bucket级别访问时,访问控制列表(ACL)将被禁用,并且只有bucket级别的标识和访问管理(IAM)权限授予对该bucket及其包含的对象的访问权限。因此,当您使用各种选项查看bucket元数据(XML API除外)创建bucket时,首先检查您是否为bucket启用了统一的bucket级别访问/细粒度权限

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

关于如何使单个对象公开可读,请阅读文档中的Java代码示例。同样,如果您的存储桶使用统一的存储桶级别访问,则不能使用这些步骤。相反,可以为bucket中的所有对象授予公共可读性,或者使用签名URL。可能这就是您出错的原因,因为您对bucket拥有统一的bucket级别访问权限,并且正在尝试不可能的内容。

 类似资料:
  • 我删除了谷歌云存储控制台上的所有权限。现在我无法删除bucket内容或向用户添加权限,即使使用gsutil也是如此。

  • 我有一个具有统一访问控制的Google云存储桶,我在权限中添加了“诱惑者”。它说该对象是公共的,但当我尝试打开链接时,仍会收到此消息:“匿名调用方没有storage.objects.get access to the Google Cloud storage object”错误代码为“401”。我希望任何用户都能够访问该链接。我该怎么做?提前谢谢! 向你问好本

  • 我已经将一些文件从S3转移到GCS,但是这些对象现在归传输服务所有,当我试图使用GSUTIL更新ACL时,它会说我不是所有者。这似乎是因为传输服务创建了它拥有的对象。是否有一种方法来模仿转移服务(或通过它的服务帐户登录),以便将所有权改变给我自己。 这样做时,我会得到以下错误: 请确保您拥有对此资源的所有者角色访问权限

  • 我已经删除了所有Azure虚拟机,现在我正在尝试从经典存储帐户中删除vhds容器存储blob。它给了我这个错误: Blob上当前有一个租约,请求中没有指定租约ID 我发现一篇文章提到了这个错误:https://blogs.technet.microsoft.com/thbrown/2015/04/04/there-is-currently-a-lease-on-the-blob-and-no-le

  • 有没有可能重新命名一个谷歌云平台项目?如果是,怎么做? 我不需要更改项目ID或编号。但我确实想更改项目名称(人类用来标识云平台项目的名称)。 谢谢你的提示!