本文档介绍 Pub/Sub 中可用的访问权限控制选项。
概览
Pub/Sub 使用 Identity and Access Management (IAM) 进行访问权限控制。
在 Pub/Sub 中,既可以在项目级别配置访问权限控制,也可以在个别资源级别配置。例如:
按主题或订阅授予访问权限,而不是授予对整个 Cloud 项目的访问权限。
如果您对单个主题或订阅仅拥有“只能查看”权限,则无法使用 Google Cloud 控制台查看该主题或订阅。您可以改用 Google Cloud CLI。
授予对有限功能的访问权限,例如只能向某主题发布消息,或者只能处理来自某订阅的消息,而不能删除该主题或订阅。
向一组开发者授予对某项目中的所有 Pub/Sub 资源的访问权限。
如需详细了解 IAM 及其功能,请参阅 IAM 文档。尤其是授予、更改和撤消对资源的访问权限部分。
每种 Pub/Sub 方法都需要必要的权限。如需查看 Pub/Sub IAM 支持的权限和角色列表,请参阅下面的角色部分。
权限和角色
本部分汇总了 Pub/Sub IAM 支持的权限和角色。
所需权限
下表列出了调用每种方法所需的权限:
REST 方法 | 所需权限 |
---|---|
projects.snapshots.create |
针对所属 Cloud 项目的 pubsub.snapshots.create 权限以及针对源订阅的 pubsub.subscriptions.consume 权限。 |
projects.snapshots.delete |
针对所请求快照的 pubsub.snapshots.delete 权限。 |
projects.snapshots.getIamPolicy |
针对所请求快照的 pubsub.snapshots.getIamPolicy 权限。 |
projects.snapshots.list |
针对所请求 Cloud 项目的 pubsub.snapshots.list 权限。 |
projects.snapshots.patch |
针对所请求快照的 pubsub.snapshots.update 权限。 |
projects.snapshots.setIamPolicy |
针对所请求快照的 pubsub.snapshots.setIamPolicy 权限。 |
projects.snapshots.testIamPermissions |
无。 |
projects.subscriptions.acknowledge |
针对所请求订阅的 pubsub.subscriptions.consume 权限。 |
projects.subscriptions.create |
针对所属 Cloud 项目的 pubsub.subscriptions.create 权限以及针对所请求主题的 pubsub.topics.attachSubscription 权限。请注意,要在项目 A 中创建对项目 B 中主题 T 的订阅,必须同时对项目 A 和主题 T 授予适当的权限。在这种情况下,可以在项目 B 的审核日志中捕获用户身份信息。 |
projects.subscriptions.delete |
针对所请求订阅的 pubsub.subscriptions.delete 权限。 |
projects.subscriptions.get |
针对所请求订阅的 pubsub.subscriptions.get 权限。 |
projects.subscriptions.getIamPolicy |
针对所请求订阅的 pubsub.subscriptions.getIamPolicy 权限。 |
projects.subscriptions.list |
针对所请求 Cloud 项目的 pubsub.subscriptions.list 权限。 |
projects.subscriptions.modifyAckDeadline |
针对所请求订阅的 pubsub.subscriptions.consume 权限。 |
projects.subscriptions.modifyPushConfig |
针对所请求订阅的 pubsub.subscriptions.update 权限。 |
projects.subscriptions.patch |
针对所请求订阅的 pubsub.subscriptions.update 权限。 |
projects.subscriptions.pull |
针对所请求订阅的 pubsub.subscriptions.consume 权限。 |
projects.subscriptions.seek |
针对所请求订阅的 pubsub.subscriptions.consume 权限,针对所请求快照的 pubsub.snapshots.seek 权限(如果有)。 |
projects.subscriptions.setIamPolicy |
针对所请求订阅的 pubsub.subscriptions.setIamPolicy 权限。 |
projects.subscriptions.testIamPermissions |
无。 |
projects.topics.create |
针对所属 Cloud 项目的 pubsub.topics.create 权限。 |
projects.topics.delete |
针对所请求主题的 pubsub.topics.delete 权限。 |
projects.topics.detachSubscription |
针对所请求主题的 pubsub.topics.detachSubscription 权限。 |
projects.topics.get |
针对所请求主题的 pubsub.topics.get 权限。 |
projects.topics.getIamPolicy |
针对所请求主题的 pubsub.topics.getIamPolicy 权限。 |
projects.topics.list |
针对所请求 Cloud 项目的 pubsub.topics.list 权限。 |
projects.topics.patch |
针对所请求主题的 pubsub.topics.update 权限。 |
projects.topics.publish |
针对所请求主题的 pubsub.topics.publish 权限。 |
projects.topics.setIamPolicy |
针对所请求主题的 pubsub.topics.setIamPolicy 权限。 |
projects.topics.subscriptions.list |
针对所请求主题的 pubsub.topics.get 权限。 |
projects.topics.testIamPermissions |
无。 |
角色
下表列出了所有 Pub/Sub 角色以及与每个角色关联的权限:
Role | Permissions |
---|---|
Pub/Sub Admin( Provides full access to topics and subscriptions. Lowest-level resources where you can grant this role:
|
pubsub.*
resourcemanager.projects.get serviceusage.quotas.get serviceusage.services.get serviceusage.services.list |
Pub/Sub Editor( Provides access to modify topics and subscriptions, and access to publish and consume messages. Lowest-level resources where you can grant this role:
|
pubsub.schemas.attach pubsub.schemas.commit pubsub.schemas.create pubsub.schemas.delete pubsub.schemas.get pubsub.schemas.list pubsub.schemas.listRevisions pubsub.schemas.rollback pubsub.schemas.validate pubsub.snapshots.create pubsub.snapshots.delete pubsub.snapshots.get pubsub.snapshots.list pubsub.snapshots.seek pubsub.snapshots.update pubsub.subscriptions.consume pubsub.subscriptions.create pubsub.subscriptions.delete pubsub.subscriptions.get pubsub.subscriptions.list pubsub.subscriptions.update pubsub. pubsub.topics.create pubsub.topics.delete pubsub. pubsub.topics.get pubsub.topics.list pubsub.topics.publish pubsub.topics.update pubsub.topics.updateTag resourcemanager.projects.get serviceusage.quotas.get serviceusage.services.get serviceusage.services.list |
Pub/Sub Publisher( Provides access to publish messages to a topic. Lowest-level resources where you can grant this role:
|
pubsub.topics.publish |
Pub/Sub Subscriber( Provides access to consume messages from a subscription and to attach subscriptions to a topic. Lowest-level resources where you can grant this role:
|
pubsub.snapshots.seek pubsub.subscriptions.consume pubsub. |
Pub/Sub Viewer( Provides access to view topics and subscriptions. Lowest-level resources where you can grant this role:
|
pubsub.schemas.get pubsub.schemas.list pubsub.schemas.listRevisions pubsub.schemas.validate pubsub.snapshots.get pubsub.snapshots.list pubsub.subscriptions.get pubsub.subscriptions.list pubsub.topics.get pubsub.topics.list resourcemanager.projects.get serviceusage.quotas.get serviceusage.services.get serviceusage.services.list |
通过 Google Cloud 控制台控制访问权限
您可以使用 Google Cloud 控制台来管理主题和项目的访问权限控制。
如需在项目级别设置访问权限控制,请按以下步骤操作:
在 Google Cloud 控制台中,前往 IAM 页面。
选择您的项目。
点击
添加。输入一个或多个主账号名称。
在选择角色列表中,选择您要授予的角色。
点击保存。
验证该主账号是否拥有您授予的角色。
如需为主题和订阅设置访问权限控制,请按以下步骤操作:
在 Google Cloud 控制台中,转到 Pub/Sub 主题列表。
如果需要,请选择已启用 Pub/Sub 的项目。
执行以下步骤之一:
要为一个或多个主题设置角色,请选择相应主题。
如需为附加到主题的订阅设置角色,请点击主题 ID。在主题详情页面中,点击订阅 ID。系统会显示订阅详情页面。
如果信息面板处于隐藏状态,请点击显示信息面板。
在权限标签页中,点击
添加主账号。输入一个或多个主账号名称。
在选择角色列表中,选择您要授予的角色。
点击保存。
通过 IAM API 控制访问权限
借助 Pub/Sub IAM API,您可以为项目中的个别主题和订阅设置和获取政策,以及测试用户对给定资源所具有的权限。与常规 Pub/Sub 方法一样,您可以通过客户端库或 API Explorer 或者直接通过 HTTP 调用 IAM API 方法。
请注意,不能使用 Pub/Sub IAM API 在 Google Cloud 项目级别管理政策。
以下部分举例说明了如何设置和获取政策,以及如何测试调用者对给定资源具有什么权限。
获取政策
借助 getIamPolicy()
方法,您可以获取现有政策。此方法将返回包含与资源关联的政策的 JSON 对象。
以下一些示例代码演示了如何获取订阅政策:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
获取订阅政策:
gcloud pubsub subscriptions get-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json
输出如下:
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.admin", "members": [ "user:user-1@gmail.com" ] }, { "role": "roles/pubsub.editor", "members": [ "serviceAccount:service-account-2@appspot.gserviceaccount.com", "user:user-3@gmail.com" } ] }
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何获取主题政策:C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
获取主题政策
gcloud pubsub topics get-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ --format json
输出如下:
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role":" roles/pubsub.viewer", "members": [ "user:user-1@gmail.com" ] } ] }
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
设置政策
借助 setIamPolicy()
方法,您可以将政策附加到资源。setIamPolicy()
方法接受一个 SetIamPolicyRequest
,它包含要设置的政策和该政策要附加到的资源。该方法将返回生成的政策。
以下一些示例代码演示了如何为订阅设置政策:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
1. 保存订阅的政策。
gcloud pubsub subscriptions get-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json > subscription_policy.json
2.打开 subscription_policy.json
并通过向适当的主账号提供适当的角色来更新绑定。如需详细了解如何使用 subscription_policy.json
文件,请参阅 IAM 文档中的政策。
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.admin", "members": [ "user:user-1@gmail.com" ] }, { "role": "roles/pubsub.editor", "members": [ "serviceAccount:service-account-2@appspot.gserviceaccount.com" } ] }
3. 应用新的订阅政策。
gcloud pubsub subscriptions set-iam-policy \ projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ subscription_policy.json
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何为主题设置政策:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
1.保存主题的政策。
gcloud pubsub topics get-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ --format json > topic_policy.json
2. 打开 topic_policy.json
并通过向适当的主账号提供适当的角色来更新绑定。如需详细了解如何使用 subscription_policy.json
文件,请参阅 IAM 文档中的政策。
{ "etag": "BwUjMhCsNvY=", "bindings": [ { "role": "roles/pubsub.editor", "members": [ "user:user-1@gmail.com", "user:user-2@gmail.com" ] } ] }
3. 应用新的主题政策。
gcloud pubsub topics set-iam-policy \ projects/${PROJECT}/topics/${TOPIC} \ topic_policy.json
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
测试权限
您可以使用 testIamPermissions()
方法检查可以为给定资源添加或移除哪些给定权限。它以参数形式接受资源名称和一组权限,并返回部分权限。
以下一些示例代码演示了如何测试订阅的权限:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
gcloud iam list-testable-permissions \ https://pubsub.googleapis.com/v1/projects/${PROJECT}/subscriptions/${SUBSCRIPTION} \ --format json
输出:
[ { "name": "pubsub.subscriptions.consume", "stage": "GA" }, { "name": "pubsub.subscriptions.delete", "stage": "GA" }, { "name": "pubsub.subscriptions.get", "stage": "GA" }, { "name": "pubsub.subscriptions.getIamPolicy", "stage": "GA" }, { "name": "pubsub.subscriptions.setIamPolicy", "stage": "GA" }, { "name": "pubsub.subscriptions.update", "stage": "GA" } ]
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
以下一些示例代码演示了如何测试主题的权限:
C#
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 C# 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub C# API 参考文档。
gcloud
gcloud iam list-testable-permissions \ https://pubsub.googleapis.com/v1/projects/${PROJECT}/topics/${TOPIC} \ --format json
输出
[ { "name": "pubsub.topics.attachSubscription", "stage": "GA" }, { "name": "pubsub.topics.delete", "stage": "GA" }, { "name": "pubsub.topics.detachSubscription", "stage": "GA" }, { "name": "pubsub.topics.get", "stage": "GA" }, { "name": "pubsub.topics.getIamPolicy", "stage": "GA" }, { "name": "pubsub.topics.publish", "stage": "GA" }, { "name": "pubsub.topics.setIamPolicy", "stage": "GA" }, { "name": "pubsub.topics.update", "stage": "GA" } ]
Go
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Go 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Go API 参考文档。
Java
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Java 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Java API 参考文档。
Node.js
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Pub/Sub Node.js API 参考文档。
PHP
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 Pub/Sub PHP API 参考文档。
Python
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Python 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Python API 参考文档。
Ruby
在尝试此示例之前,请按照《快速入门:使用客户端库》中的 Ruby 设置说明进行操作。 如需了解详情,请参阅 Pub/Sub Ruby API 参考文档。
示例使用场景:跨项目通信
Pub/Sub IAM 对于在跨项目通信中微调访问权限很有用。
假设 Cloud 项目 A 中的一个服务帐号想要向 Cloud 项目 B 中的一个主题发布消息。首先,在项目 A 中启用 Pub/Sub API。
然后,向服务帐号授予 Cloud 项目 B 中的修改权限。但是,这种方法通常过于粗糙。您可以使用 IAM API 实现更精细的访问权限级别。
例如,以下代码段使用 project-b 中的 setIamPolicy()
方法和一个准备好的 topic_policy.json
文件向 project-a 的服务账号 foobar@
project-a.iam.gserviceaccount.com
授予针对主题 projects/
project-b/topics/
topic-b 的 Publisher 角色:
gcloud pubsub topics set-iam-policy \ projects/project-b/topics/topic-b \ topic_policy.json输出:
Updated IAM policy for topic topic-b. bindings: - members: - serviceAccount:foobar@project-a.iam.gserviceaccount.com role: roles/pubsub.publisher etag: BwWGrQYX6R4=
部分可用性行为
授权检查取决于 IAM 子系统。为了持续对数据操作提供低延迟的响应(发布和消息处理),系统可能会依赖于缓存的 IAM 政策。如需了解更改何时生效,请参阅 IAM 文档。