Zugriffssteuerung

In diesem Dokument werden die Zugriffssteuerungsoptionen beschrieben, die in Cloud Pub/Sub zur Verfügung stehen.

  1. Überblick
  2. Berechtigungen und Rollen
    1. Erforderliche Berechtigungen
    2. Rollen
  3. Zugriffssteuerung über die GCP Console
  4. Zugriffssteuerung über die Cloud Pub/Sub IAM API
    1. Richtlinien abrufen
    2. Richtlinien festlegen
    3. Berechtigungen testen
  5. Beispielanwendungsfall: Projektübergreifende Kommunikation
  6. Verhalten bei teilweiser Verfügbarkeit

Überblick

Cloud Pub/Sub verwendet Google Cloud Identity and Access Management (Cloud IAM) für die Zugriffssteuerung.

In Cloud Pub/Sub kann die Zugriffssteuerung auf Projektebene und auf der individuellen Ressourcenebene konfiguriert werden. Beispiel:

  • Zugriff je nach Thema oder Abo und nicht für das gesamte Cloud-Projekt gewähren.
  • Zugriff mit begrenzten Möglichkeiten gewähren, zum Beispiel zum Veröffentlichen von Nachrichten nur zu einem Thema oder zum Erhalten von Nachrichten aus einem Abo ohne Löschen des Themas oder Abos.
  • Zugriff auf alle Cloud Pub/Sub-Ressourcen in einem Projekt für eine Gruppe von Entwicklern erteilen.

Eine detaillierte Beschreibung zu IAM und den zugehörigen Funktionen finden Sie im Entwicklerhandbuch zu Cloud Identity and Access Management. Besonders im Abschnitt IAM-Richtlinien verwalten finden Sie relevante Informationen.

Für den Aufruf jeder Methode in Cloud Pub/Sub werden die erforderlichen Berechtigungen benötigt. Eine Liste der Berechtigungen und Rollen, die Cloud Pub/Sub IAM unterstützt, finden Sie im folgenden Abschnitt.

Berechtigungen und Rollen

In diesem Abschnitt werden die von Cloud Pub/Sub IAM unterstützten Berechtigungen und Rollen beschrieben.

Erforderliche Berechtigungen

In der folgenden Tabelle sind die Berechtigungen aufgelistet, die der Aufrufer besitzen muss, um eine bestimmte Methode aufrufen zu können:

Methode Erforderliche Berechtigungen
projects.subscriptions.acknowledge pubsub.subscriptions.consume für das angeforderte Abo.
projects.subscriptions.create pubsub.subscriptions.create für das zugehörige Cloud-Projekt und pubsub.topics.attachSubscription für das angeforderte Thema. Wenn Sie ein Abo in Projekt A für ein Thema T in Projekt B erstellen möchten, müssen die entsprechenden Berechtigungen sowohl für Projekt A als auch für Thema T erteilt werden.
projects.subscriptions.delete pubsub.subscriptions.delete für das angeforderte Abo.
projects.subscriptions.get pubsub.subscriptions.get für das angeforderte Abo.
projects.subscriptions.getIamPolicy pubsub.subscriptions.getIamPolicy für das angeforderte Abo.
projects.subscriptions.list pubsub.subscriptions.list für das angeforderte Abo.
projects.subscriptions.modifyAckDeadline pubsub.subscriptions.consume für das angeforderte Abo.
projects.subscriptions.modifyPushConfig pubsub.subscriptions.update für das angeforderte Abo.
projects.subscriptions.pull pubsub.subscriptions.consume für das angeforderte Abo.
projects.subscriptions.setIamPolicy pubsub.subscriptions.setIamPolicy für das angeforderte Abo.
projects.subscriptions.testIamPermissions Keine.
projects.topics.create pubsub.topics.create für das Cloud-Projekt, in dem das Abo enthalten ist.
projects.topics.delete pubsub.topics.delete für das angeforderte Thema.
projects.topics.get pubsub.topics.get für das angeforderte Thema.
projects.topics.getIamPolicy pubsub.topics.getIamPolicy für das angeforderte Thema.
projects.topics.list pubsub.topics.list für das angeforderte Abo.
projects.topics.publish pubsub.topics.publish für das angeforderte Thema.
projects.topics.setIamPolicy pubsub.topics.setIamPolicy für das angeforderte Thema.
projects.topics.testIamPermissions Keine.
projects.topics.subscriptions.list pubsub.topics.get für das angeforderte Thema.

Rollen

In der folgenden Tabelle sind die Cloud Pub/Sub-IAM-Rollen und die jeweiligen Berechtigungen der Rollen aufgeführt. Beachten Sie, dass jede Berechtigung für einen bestimmten Ressourcentyp gilt.

Diese vorkonfigurierten Rollen berücksichtigen viele typische Anwendungsfälle. Möglicherweise benötigen Sie jedoch eine Rolle, die einen benutzerdefinierten Satz von Berechtigungen enthält. Sie können beispielsweise eine Rolle erstellen, die einen Nutzer berechtigt, ein Abo in einem Projekt zu erstellen, ohne dass er vorhandene Themen oder Abos im Projekt löschen oder aktualisieren kann. In diesen Fällen können Sie möglicherweise eine benutzerdefinierte Cloud IAM-Rolle erstellen, die Ihren Anforderungen entspricht.

Rolle enthält die Berechtigungen: für den Ressourcentyp:
roles/pubsub.publisher pubsub.topics.publish Thema
roles/pubsub.subscriber
pubsub.subscriptions.consume Abo
pubsub.topics.attachSubscription Thema
roles/pubsub.viewer oder
roles/viewer
pubsub.topics.list Projekt
pubsub.topics.get Thema
pubsub.subscriptions.list Projekt
pubsub.subscriptions.get Abo
roles/pubsub.editor oder
roles/editor
Alle genannten und:
pubsub.topics.create Projekt
pubsub.topics.delete Thema
pubsub.topics.update Thema
pubsub.subscriptions.create Projekt
pubsub.subscriptions.delete Abo
pubsub.subscriptions.update Abo
roles/pubsub.admin oder
roles/owner
Alle genannten und:
pubsub.topics.getIamPolicy Thema
pubsub.topics.setIamPolicy Thema
pubsub.subscriptions.getIamPolicy Abo
pubsub.subscriptions.setIamPolicy Abo
Beachten Sie, dass die Rollen roles/owner, roles/editor und roles/viewer auch Berechtigungen für andere Dienste der Google Cloud Platform enthalten.

Zugriffssteuerung über die GCP Console

Mit der GCP Console können Sie die Zugriffssteuerung für Ihre Themen und Projekte verwalten.

So legen Sie die Zugriffssteuerung auf Projektebene fest:

  1. Öffnen Sie die IAM-Seite in der Google Cloud Platform Console.
  2. Wählen Sie Ihr Projekt aus und klicken Sie auf Weiter.
  3. Klicken Sie auf Mitglied hinzufügen.
  4. Geben Sie die E-Mail-Adresse eines neuen Mitglieds ein, dem Sie zuvor keine IAM-Rolle zugewiesen haben.
  5. Wählen Sie die gewünschte Rolle im Drop-down-Menü aus.
  6. Klicken Sie auf Hinzufügen.
  7. Prüfen Sie, ob das Mitglied unter der von Ihnen zugewiesenen Rolle aufgelistet ist.

So legen Sie Zugriffssteuerungen für Themen und Abos fest:

  1. Rufen Sie in der GCP Console die Seite Pub/Sub-Themen auf und wählen Sie das Cloud Pub/Sub-Projekt aus.
  2. Wählen Sie das Thema oder das Abo aus, für das Sie Berechtigungen festlegen möchten.

    Sie können gleichzeitig Berechtigungen für mehrere Themen festlegen. Klappen Sie zum Festlegen von Berechtigungen für ein Abo eines Themas das Thema auf und klicken Sie auf das Abo, sodass es auf einer eigenen Seite geöffnet wird.

  3. Klicken Sie auf Berechtigungen. Am Rand des Bildschirms wird der Bereich "Berechtigungen" angezeigt.
  4. Geben Sie einen oder mehrere Mitgliedsnamen ein, wählen Sie eine Rolle im Drop-down-Menü auf der rechten Seite aus und klicken Sie auf Hinzufügen.

Zugriffssteuerung über die Cloud Pub/Sub IAM API

Mit der Cloud Pub/Sub IAM API können Sie Richtlinien zu einzelnen Themen und Abonnements in einem Projekt festlegen und abrufen und die Berechtigungen eines Nutzers für eine bestimmte Ressource testen. Wie bei den regulären Cloud Pub/Sub-Methoden können Sie die IAM-Methoden über die Clientbibliotheken, den API Explorer oder direkt über HTTP aufrufen.

Beachten Sie, dass Sie die Cloud Pub/Sub IAM API nicht zum Verwalten von Richtlinien auf der Cloudprojektebene verwenden können.

Die folgenden Abschnitte enthalten Beispiele zum Festlegen und Abrufen von Richtlinien sowie zum Testen der Berechtigungen, die ein Aufrufer für eine bestimmte Ressource hat.

Richtlinien abrufen

Mit der Methode getIamPolicy() können Sie eine bereits festgelegte Richtlinie abrufen. Diese Methode gibt ein JSON-Objekt zurück, das die Richtlinien enthält, die mit der Ressource verbunden sind.

Es folgt Beispielcode zum Abrufen von Richtlinien für ein Abo:

C#

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von C#, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub C# API.

SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
Policy policy = publisher.GetIamPolicy(subscriptionName.ToString());
Console.WriteLine($"Subscription IAM Policy found for {subscriptionId}:");
Console.WriteLine(policy.Bindings);

Befehl GCLOUD

Themenrichtlinie speichern:

gcloud beta pubsub subscriptions get-iam-policy projects/{your_project}/subscriptions/ \
{your_topic} --format json > subscription_policy.json

Ausgabe:

    {
      "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

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Go, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Go API.

policy, err := c.Subscription(subName).IAM().Policy(ctx)
if err != nil {
	return nil, err
}
for _, role := range policy.Roles() {
	log.Printf("%q: %q", role, policy.Members(role))
}

Java

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Java, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Java API.

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  Policy policy = subscriptionAdminClient.getIamPolicy(subscriptionName.toString());
  if (policy == null) {
    // subscription was not found
  }
  return policy;
}

Node.js

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Node.js, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Node.js API.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

// Retrieves the IAM policy for the subscription
const [policy] = await pubsub.subscription(subscriptionName).iam.getPolicy();
console.log(`Policy for subscription: ${JSON.stringify(policy.bindings)}.`);

PHP

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von PHP, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the policy for a PubSub subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function get_subscription_policy($projectId, $subscriptionName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $policy = $subscription->iam()->policy();
    print_r($policy);
}

Python

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Python, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Python API.

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

policy = client.get_iam_policy(subscription_path)

print('Policy for subscription {}:'.format(subscription_path))
for binding in policy.bindings:
    print('Role: {}, Members: {}'.format(binding.role, binding.members))

Ruby

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Ruby, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Ruby API.

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
policy       = subscription.policy

puts "Subscription policy:"
puts policy.roles

Es folgt Beispielcode zum Abrufen von Richtlinien für ein Thema:

C#

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von C#, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub C# API.

TopicName topicName = new TopicName(projectId, topicId);
Policy policy = publisher.GetIamPolicy(topicName.ToString());
Console.WriteLine($"Topic IAM Policy found for {topicId}:");
Console.WriteLine(policy.Bindings);

Befehl GCLOUD

Themenrichtlinie abrufen

gcloud beta pubsub topics get-iam-policy projects/{your_project}/topics/{your_topic} \
--format json > topic_policy.json

Ausgabe:

    {
      "etag": "BwUjMhCsNvY=",
      "bindings": [
        {
          "role":" roles/pubsub.viewer",
          "members": [
            "user:user-1@gmail.com"
          ]
        }
      ]
    }

Go

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Go, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Go API.

policy, err := c.Topic(topicName).IAM().Policy(ctx)
if err != nil {
	return nil, err
}
for _, role := range policy.Roles() {
	log.Print(policy.Members(role))
}

Java

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Java, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Java API.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
  Policy policy = topicAdminClient.getIamPolicy(topicName.toString());
  if (policy == null) {
    // topic iam policy was not found
  }
  return policy;
}

Node.js

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Node.js, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Node.js API.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

// Retrieves the IAM policy for the topic
const [policy] = await pubsub.topic(topicName).iam.getPolicy();
console.log(`Policy for topic: %j.`, policy.bindings);

PHP

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von PHP, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the policy for a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function get_topic_policy($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $policy = $topic->iam()->policy();
    print_r($policy);
}

Python

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Python, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Python API.

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

policy = client.get_iam_policy(topic_path)

print('Policy for topic {}:'.format(topic_path))
for binding in policy.bindings:
    print('Role: {}, Members: {}'.format(binding.role, binding.members))

Ruby

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Ruby, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Ruby API.

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic  = pubsub.topic topic_name
policy = topic.policy

puts "Topic policy:"
puts policy.roles

Richtlinien festlegen

Mit der Methode setIamPolicy() können Sie eine Richtlinie einer Ressource zuweisen. Die Methode setIamPolicy() nimmt eine SetIamPolicyRequest entgegen, in der die festzulegende Richtlinie und die Ressource enthalten sind, der die Richtlinie zugewiesen ist. Sie gibt die entsprechende Richtlinie zurück.

Der folgende Beispielcode dient zum Festlegen von Richtlinien für ein Abo:

C#

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von C#, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub C# API.

Policy policy = new Policy
{
    Bindings =
    {
        new Binding { Role = roleToBeAddedToPolicy,
            Members = { member } }
    }
};
SetIamPolicyRequest request = new SetIamPolicyRequest
{
    Resource = new SubscriptionName(projectId, subscriptionId).ToString(),
    Policy = policy
};
Policy response = publisher.SetIamPolicy(request);
Console.WriteLine($"Subscription IAM Policy updated: {response}");

Befehl GCLOUD

1 Rufen Sie die Richtlinie für das Abo ab.

gcloud beta pubsub subscriptions get-iam-policy projects/{your_project}/subscriptions/ \
{your_subscription} --format json > subscription_policy.json

2. Öffnen Sie die subscription_policy.json und aktualisieren Sie die Bindungen, indem Sie den entsprechenden Mitgliedern die entsprechenden Rollen zuweisen. Weitere Informationen zum Arbeiten mit den Dateien subscription_policy.json finden Sie im Richtliniendokument zu Cloud Identity and Access Management.

    {
      "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. Wenden Sie die neue Richtlinie für Abos an.

gcloud beta pubsub subscriptions set-iam-policy projects/{your_project}/subscriptions/ \
{your_subscription} subscription_policy.json

Go

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Go, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Go API.

sub := c.Subscription(subName)
policy, err := sub.IAM().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
policy.Add(iam.AllUsers, iam.Viewer)
policy.Add("group:cloud-logs@google.com", iam.Editor)
if err := sub.IAM().SetPolicy(ctx, policy); err != nil {
	return err
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Java, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Java API.

try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  Policy policy = subscriptionAdminClient.getIamPolicy(subscriptionName.toString());
  // Create a role => members binding
  Binding binding =
      Binding.newBuilder()
          .setRole(Role.viewer().toString())
          .addMembers(Identity.allAuthenticatedUsers().toString())
          .build();
  // Update policy
  Policy updatedPolicy = policy.toBuilder().addBindings(binding).build();

  updatedPolicy =
      subscriptionAdminClient.setIamPolicy(subscriptionName.toString(), updatedPolicy);
  return updatedPolicy;
}

Node.js

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Node.js, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Node.js API.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

// The new IAM policy
const newPolicy = {
  bindings: [
    {
      // Add a group as editors
      role: `roles/pubsub.editor`,
      members: [`group:cloud-logs@google.com`],
    },
    {
      // Add all users as viewers
      role: `roles/pubsub.viewer`,
      members: [`allUsers`],
    },
  ],
};

// Updates the IAM policy for the subscription
const [updatedPolicy] = await pubsub
  .subscription(subscriptionName)
  .iam.setPolicy(newPolicy);
console.log(`Updated policy for subscription: %j`, updatedPolicy.bindings);

PHP

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von PHP, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Adds a user to the policy for a Pub/Sub subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 * @param string $userEmail  The user email to add to the policy.
 */
function set_subscription_policy($projectId, $subscriptionName, $userEmail)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $policy = $subscription->iam()->policy();
    $policy['bindings'][] = [
        'role' => 'roles/pubsub.subscriber',
        'members' => ['user:' . $userEmail]
    ];
    $subscription->iam()->setPolicy($policy);

    printf('User %s added to policy for %s' . PHP_EOL,
        $userEmail,
        $subscriptionName);
}

Python

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Python, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Python API.

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

policy = client.get_iam_policy(subscription_path)

# Add all users as viewers.
policy.bindings.add(
    role='roles/pubsub.viewer',
    members=['allUsers'])

# Add a group as an editor.
policy.bindings.add(
    role='roles/editor',
    members=['group:cloud-logs@google.com'])

# Set the policy
policy = client.set_iam_policy(subscription_path, policy)

print('IAM policy for subscription {} set: {}'.format(
    subscription_name, policy))

Ruby

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Ruby, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Ruby API.

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
subscription.policy do |policy|
  policy.add "roles/pubsub.subscriber",
             "serviceAccount:account-name@project-name.iam.gserviceaccount.com"
end

Es folgt ein Abschnitt mit Beispielcode zum Festlegen von Richtlinien für ein Thema:

C#

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von C#, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub C# API.

Policy policy = new Policy
{
    Bindings =
        {
            new Binding { Role = roleToBeAddedToPolicy,
                Members = { member } }
        }
};
SetIamPolicyRequest request = new SetIamPolicyRequest
{
    Resource = new TopicName(projectId, topicId).ToString(),
    Policy = policy
};
Policy response = publisher.SetIamPolicy(request);
Console.WriteLine($"Topic IAM Policy updated: {response}");

Befehl GCLOUD

1 Rufen Sie die Themenrichtlinie ab.

gcloud beta pubsub topics get-iam-policy projects/{your_project}/topics/{your_topic} \
--format json > topic_policy.json

2. Öffnen Sie topic_policy.json und aktualisieren Sie die Bindungen, indem Sie den entsprechenden Mitgliedern die entsprechenden Rollen zuweisen. Weitere Informationen zum Arbeiten mit den Dateien subscription_policy.json finden Sie im Richtliniendokument zu Cloud Identity and Access Management.

    {
      "etag": "BwUjMhCsNvY=",
      "bindings": [
        {
          "role": "roles/pubsub.editor",
          "members": [
            "user:user-1@gmail.com",
            "user:user-2@gmail.com"
          ]
        }
      ]
    }

3. Wenden Sie die neue Themenrichtlinie an.

gcloud beta pubsub topics set-iam-policy projects/{your_project}/ \
topics/{your_topic} topic_policy.json

Go

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Go, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Go API.

topic := c.Topic(topicName)
policy, err := topic.IAM().Policy(ctx)
if err != nil {
	return err
}
// Other valid prefixes are "serviceAccount:", "user:"
// See the documentation for more values.
policy.Add(iam.AllUsers, iam.Viewer)
policy.Add("group:cloud-logs@google.com", iam.Editor)
if err := topic.IAM().SetPolicy(ctx, policy); err != nil {
	log.Fatalf("SetPolicy: %v", err)
}
// NOTE: It may be necessary to retry this operation if IAM policies are
// being modified concurrently. SetPolicy will return an error if the policy
// was modified since it was retrieved.

Java

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Java, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Java API.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  String topicName = ProjectTopicName.format(projectId, topicId);
  Policy policy = topicAdminClient.getIamPolicy(topicName);
  // add role -> members binding
  Binding binding =
      Binding.newBuilder()
          .setRole(Role.viewer().toString())
          .addMembers(Identity.allAuthenticatedUsers().toString())
          .build();
  // create updated policy
  Policy updatedPolicy = Policy.newBuilder(policy).addBindings(binding).build();
  updatedPolicy = topicAdminClient.setIamPolicy(topicName, updatedPolicy);
  return updatedPolicy;
}

Node.js

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Node.js, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Node.js API.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

// The new IAM policy
const newPolicy = {
  bindings: [
    {
      // Add a group as editors
      role: `roles/pubsub.editor`,
      members: [`group:cloud-logs@google.com`],
    },
    {
      // Add all users as viewers
      role: `roles/pubsub.viewer`,
      members: [`allUsers`],
    },
  ],
};

// Updates the IAM policy for the topic
const [updatedPolicy] = await pubsub
  .topic(topicName)
  .iam.setPolicy(newPolicy);
console.log(`Updated policy for topic: %j`, updatedPolicy.bindings);

PHP

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von PHP, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Adds a user to the policy for a Pub/Sub topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 * @param string $userEmail  The user email to add to the policy.
 */
function set_topic_policy($projectId, $topicName, $userEmail)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $policy = $topic->iam()->policy();
    $policy['bindings'][] = [
        'role' => 'roles/pubsub.publisher',
        'members' => ['user:' . $userEmail]
    ];
    $topic->iam()->setPolicy($policy);

    printf('User %s added to policy for %s' . PHP_EOL,
        $userEmail,
        $topicName);
}

Python

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Python, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Python API.

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

policy = client.get_iam_policy(topic_path)

# Add all users as viewers.
policy.bindings.add(
    role='roles/pubsub.viewer',
    members=['allUsers'])

# Add a group as a publisher.
policy.bindings.add(
    role='roles/pubsub.publisher',
    members=['group:cloud-logs@google.com'])

# Set the policy
policy = client.set_iam_policy(topic_path, policy)

print('IAM policy for topic {} set: {}'.format(
    topic_name, policy))

Ruby

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Ruby, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Ruby API.

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic = pubsub.topic topic_name
topic.policy do |policy|
  policy.add "roles/pubsub.publisher",
             "serviceAccount:account_name@project_name.iam.gserviceaccount.com"
end

Berechtigungen testen

Mit der Methode testIamPermissions() können Sie prüfen, welche der Berechtigungen der Aufrufer für die angegebene Ressource hat. Als Parameter werden ein Ressourcenname und ein Satz von Berechtigungen verwendet. Die Teilmenge der Berechtigungen, die der Aufrufer hat, wird zurückgegeben.

Es folgt Beispielcode zum Testen von Berechtigungen für ein Abo:

C#

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von C#, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub C# API.

List<string> permissions = new List<string>();
permissions.Add("pubsub.subscriptions.get");
permissions.Add("pubsub.subscriptions.update");
TestIamPermissionsRequest request = new TestIamPermissionsRequest
{
    Resource = new SubscriptionName(_projectId, subscriptionId).ToString(),
    Permissions = { permissions }
};
TestIamPermissionsResponse response = publisher.TestIamPermissions(request);
return response;

Befehl GCLOUD

gcloud iam list-testable-permissions https://pubsub.googleapis.com/v1/projects/ \
{your_project}/subscriptions/{your_subscription} --format json

Ausgabe:

  [
    {
      "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

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Go, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Go API.

sub := c.Subscription(subName)
perms, err := sub.IAM().TestPermissions(ctx, []string{
	"pubsub.subscriptions.consume",
	"pubsub.subscriptions.update",
})
if err != nil {
	return nil, err
}
for _, perm := range perms {
	log.Printf("Allowed: %v", perm)
}

Java

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Java, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Java API.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  List<String> permissions = new LinkedList<>();
  permissions.add("pubsub.subscriptions.get");
  ProjectSubscriptionName subscriptionName =
      ProjectSubscriptionName.of(projectId, subscriptionId);
  TestIamPermissionsResponse testedPermissions =
      topicAdminClient.testIamPermissions(subscriptionName.toString(), permissions);
  return testedPermissions;
}

Node.js

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Node.js, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Node.js API.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const subscriptionName = 'my-sub';

const permissionsToTest = [
  `pubsub.subscriptions.consume`,
  `pubsub.subscriptions.update`,
];

// Tests the IAM policy for the specified subscription
const [permissions] = await pubsub
  .subscription(subscriptionName)
  .iam.testPermissions(permissionsToTest);
console.log(`Tested permissions for subscription: %j`, permissions);

PHP

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von PHP, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the permissions of a subscription.
 *
 * @param string $projectId  The Google project ID.
 * @param string $subscriptionName  The Pub/Sub subscription name.
 */
function test_subscription_permissions($projectId, $subscriptionName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $subscription = $pubsub->subscription($subscriptionName);
    $permissions = $subscription->iam()->testPermissions([
        'pubsub.subscriptions.consume',
        'pubsub.subscriptions.update'
    ]);
    foreach ($permissions as $permission) {
        printf('Permission: %s' . PHP_EOL, $permission);
    }
}

Python

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Python, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Python API.

client = pubsub_v1.SubscriberClient()
subscription_path = client.subscription_path(project, subscription_name)

permissions_to_check = [
    'pubsub.subscriptions.consume',
    'pubsub.subscriptions.update'
]

allowed_permissions = client.test_iam_permissions(
    subscription_path, permissions_to_check)

print('Allowed permissions for subscription {}: {}'.format(
    subscription_path, allowed_permissions))

Ruby

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Ruby, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Ruby API.

# project_id        = "Your Google Cloud Project ID"
# subscription_name = "Your Pubsub subscription name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

subscription = pubsub.subscription subscription_name
permissions  = subscription.test_permissions "pubsub.subscriptions.consume",
                                             "pubsub.subscriptions.update"

puts "Permission to consume" if permissions.include? "pubsub.subscriptions.consume"
puts "Permission to update" if permissions.include? "pubsub.subscriptions.update"

Es folgt Beispielcode zum Festlegen von Richtlinien für ein Thema:

C#

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von C#, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub C# API.

List<string> permissions = new List<string>();
permissions.Add("pubsub.topics.get");
permissions.Add("pubsub.topics.update");
TestIamPermissionsRequest request = new TestIamPermissionsRequest
{
    Resource = new TopicName(_projectId, topicId).ToString(),
    Permissions = { permissions }
};
TestIamPermissionsResponse response = publisher.TestIamPermissions(request);
return response;

Befehl GCLOUD

gcloud beta iam list-testable-permissions https://pubsub.googleapis.com/v1/projects/ \
{your_project}/subscriptions/{your_subscription} --format json

Ausgabe

  [
    {
      "name": "pubsub.topics.attachSubscription",
      "stage": "GA"
    },
    {
      "name": "pubsub.topics.delete",
      "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

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Go, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Go API.

topic := c.Topic(topicName)
perms, err := topic.IAM().TestPermissions(ctx, []string{
	"pubsub.topics.publish",
	"pubsub.topics.update",
})
if err != nil {
	return nil, err
}
for _, perm := range perms {
	log.Printf("Allowed: %v", perm)
}

Java

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Java, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Java API.

try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
  List<String> permissions = new LinkedList<>();
  permissions.add("pubsub.topics.get");
  ProjectTopicName topicName = ProjectTopicName.of(projectId, topicId);
  TestIamPermissionsResponse testedPermissions =
      topicAdminClient.testIamPermissions(topicName.toString(), permissions);
  return testedPermissions;
}

Node.js

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Node.js, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Node.js API.

// Imports the Google Cloud client library
const {PubSub} = require('@google-cloud/pubsub');

// Creates a client
const pubsub = new PubSub();

/**
 * TODO(developer): Uncomment the following line to run the sample.
 */
// const topicName = 'my-topic';

const permissionsToTest = [
  `pubsub.topics.attachSubscription`,
  `pubsub.topics.publish`,
  `pubsub.topics.update`,
];

// Tests the IAM policy for the specified topic
const [permissions] = await pubsub
  .topic(topicName)
  .iam.testPermissions(permissionsToTest);
console.log(`Tested permissions for topic: %j`, permissions);

PHP

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von PHP, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub PHP API.

use Google\Cloud\PubSub\PubSubClient;

/**
 * Prints the permissions of a topic.
 *
 * @param string $projectId  The Google project ID.
 * @param string $topicName  The Pub/Sub topic name.
 */
function test_topic_permissions($projectId, $topicName)
{
    $pubsub = new PubSubClient([
        'projectId' => $projectId,
    ]);
    $topic = $pubsub->topic($topicName);
    $permissions = $topic->iam()->testPermissions([
        'pubsub.topics.attachSubscription',
        'pubsub.topics.publish',
        'pubsub.topics.update'
    ]);
    foreach ($permissions as $permission) {
        printf('Permission: %s' . PHP_EOL, $permission);
    }
}

Python

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Python, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Python API.

client = pubsub_v1.PublisherClient()
topic_path = client.topic_path(project, topic_name)

permissions_to_check = [
    'pubsub.topics.publish',
    'pubsub.topics.update'
]

allowed_permissions = client.test_iam_permissions(
    topic_path, permissions_to_check)

print('Allowed permissions for topic {}: {}'.format(
    topic_path, allowed_permissions))

Ruby

Lesen Sie unter Cloud Pub/Sub Schnellstart: Clientbibliotheken verwenden die Anleitung zur Einrichtung von Ruby, bevor Sie dieses Beispiel ausprobieren. Weitere Informationen finden Sie in der Referenzdokumentation zur Cloud Pub/Sub Ruby API.

# project_id = "Your Google Cloud Project ID"
# topic_name = "Your Pubsub topic name"
require "google/cloud/pubsub"

pubsub = Google::Cloud::Pubsub.new project: project_id

topic       = pubsub.topic topic_name
permissions = topic.test_permissions "pubsub.topics.attachSubscription",
                                     "pubsub.topics.publish", "pubsub.topics.update"

puts "Permission to attach subscription" if permissions.include? "pubsub.topics.attachSubscription"
puts "Permission to publish" if permissions.include? "pubsub.topics.publish"
puts "Permission to update" if permissions.include? "pubsub.topics.update"

Beispielanwendungsfall: Projektübergreifende Kommunikation

Cloud Pub/Sub IAM ist nützlich, um bei projektübergreifender Kommunikation die Zugriffsrechte genau abzustimmen. Nehmen wir beispielsweise an, ein Dienstkonto im Cloudprojekt A möchte Nachrichten zu einem Thema im Cloudprojekt B veröffentlichen. Sie können dies erreichen, indem Sie dem Dienstkonto die Bearbeitungsberechtigung für das Cloudprojekt B gewähren. Diese Methode ist oft aber zu ungenau. Mit der IAM-API können Sie die Zugriffsebene noch präziser festlegen.

Dieses Snippet verwendet beispielsweise die Methode setIamPolicy() und die vorbereitete Datei topic_policy.json, um dem Dienstkonto foobar@appspot.gserviceaccount.com die Publisher-Rolle für das Thema projects/myproject/topics/mytopic zu gewähren:

gcloud beta pubsub topics set-iam-policy projects/{your_project}/topics/ \
{your_topic} topic_policy.json

Ausgabe:

Updated IAM policy for topic [your-topic].
bindings:
- members:
  - serviceAccount:foobar@appspot.gserviceaccount.com
  role: roles/pubsub.publisher
etag: BwWGrQYX6R4=

Verhalten bei teilweiser Verfügbarkeit

Autorisierungsprüfungen sind vom Subsystem Cloud Identity and Access Management abhängig. Das System kann auf im Cache gespeicherte IAM-Richtlinien zurückgreifen, um eine konsistent niedrige Reaktionslatenz für Datenoperationen (Veröffentlichung und Nachrichtenverbrauch) zu bieten. Weitere Informationen dazu, wann Ihre Änderungen wirksam werden, finden Sie in der Cloud IAM-Dokumentation.

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Cloud Pub/Sub-Dokumentation