【问题标题】:Accessing Google Cloud Storage from Grails Application从 Grails 应用程序访问 Google Cloud Storage
【发布时间】:2025-12-20 16:05:05
【问题描述】:

来自 grails 应用程序我想在存储桶中创建一个 blob。 我已经在谷歌云中创建了存储桶,创建了服务帐户,并授予所有者对同一服务帐户的存储桶访问权限。后来创建了服务帐户密钥 project-id-c4b144.json 并保存了所有凭据。

StorageOptions storageOptions = StorageOptions.newBuilder()
                            .setCredentials(ServiceAccountCredentials
                            .fromStream(new FileInputStream("/home/etibar/Downloads/project-id-c4b144.json"))) // setting credentials
                            .setProjectId("project-id") //setting project id, in reality it is different
                            .build()
                    Storage storage=storageOptions.getService()
                    BlobId blobId = BlobId.of("dispatching-photos", "blob_name")
                    BlobInfo blobInfo = BlobInfo.newBuilder(blobId).setContentType("text/plain").build()
                    Blob blob = storage.create(blobInfo, "Hello, Cloud Storage!".getBytes(StandardCharsets.UTF_8))

当我运行此代码时,我收到一条 json 错误消息。

Caused by: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
  "code" : 403,
  "errors" : [ {
    "domain" : "global",
    "message" : "Caller does not have storage.objects.create access to bucket dispatching-photos.",
    "reason" : "forbidden"
  } ],
  "message" : "Caller does not have storage.objects.create access to bucket dispatching-photos."
}

| Grails 版本:3.2.10 | Groovy 版本:2.4.10 | JVM版本:1.8.0_131

google-cloud-datastore:1.2.1

google-auth-library-oauth2-http:0.7.1

谷歌云存储:1.2.2

【问题讨论】:

  • 服务帐户算作拥有自己独立权限集的唯一用户。与凭据 project-id-c4b144.json 关联的服务帐户是否有权在该存储桶中创建对象?
  • @Brandon Yarbrough,是的,我从 json 文件中获取了客户电子邮件,并将其添加为“存储桶权限”中的存储桶管理员。
  • 这是您运行的实际代码吗?它看起来在语法上无效(几行缺少分号),并且看起来它处于编辑的中间状态(似乎不需要 storage.get() 调用)。另外,我怀疑您的项目 ID 实际上不是“项目 ID”——您这样做是为了在帖子中隐藏您的真实项目 ID,还是您在代码中使用的值?
  • @Mike Schwartz,我正在使用 groovy 进行开发,它也运行 java 代码。所以在 groovy 中,你不需要使用分号。实际上,代码是相似的,它没有 storage.get() 。我更新了代码。感谢您指出。是的,真实的项目 ID 不同。

标签: google-cloud-storage google-oauth


【解决方案1】:

关于 json 文件对应的服务帐户——我敢打赌:

A) 您尝试访问的存储桶属于不同的项目,而不是您将该帐户设置为存储管理员的项目

或 B)您正在为与该 json 文件对应的不同服务帐户设置权限

【讨论】:

  • 谢谢。是的,即使存储桶可以被两个不同的项目访问,它也会出现访问问题。因此,在我的情况下,两个项目可以访问同一个存储桶(“dispatching-photos”):project1 和 project2,服务帐户是对应于 project2 创建的。因此,当我在 project2 下创建另一个存储桶并且 project1 无法访问时,在新存储桶中创建 blob 就可以了。所以我们会进一步调查这个问题。我已经放弃了您的回复,但是,目前我不确定到底是什么问题。一旦我确定,我会保持更新。
  • 原因可能是您用于创建对象的服务帐户仅对 project2 具有存储管理员权限。如果您希望该服务帐户能够访问 project1 中的存储桶,您还必须将该帐户添加为 project1 的项目成员并为其授予存储管理员权限。
最近更新 更多