管理对项目、文件夹和组织的访问权限

本页面介绍如何授予、更改和撤消项目、文件夹和组织的访问权限。如需了解如何管理对其他资源的访问权限,请参阅以下指南:

在 Identity and Access Management (IAM) 中,通过允许政策(也称为 IAM 政策)授予访问权限。允许政策已附加到 Google Cloud 资源。每个允许政策都包含一组角色绑定,这些角色绑定会将一个或多个主账号(例如用户或服务账号)与 IAM 角色相关联。这些角色绑定会向主账号授予指定的角色,包括允许政策所关联的资源以及该资源的所有后代。如需详细了解允许政策,请参阅了解允许政策

您可以使用 Google Cloud 控制台、Google Cloud CLI、REST API 或 Resource Manager 客户端库来管理对项目、文件夹和组织的访问权限。

准备工作

  • Enable the Resource Manager API.

    Enable the API

  • 设置身份验证。

    Select the tab for how you plan to use the samples on this page:

    Console

    When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.

    gcloud

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

    C#

    如需在本地开发环境中使用本页面上的 .NET 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Java

    如需在本地开发环境中使用本页面上的 Java 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    Python

    如需在本地开发环境中使用本页面上的 Python 示例,请安装并初始化 gcloud CLI,然后使用您的用户凭据设置应用默认凭据。

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    如需了解详情,请参阅 Google Cloud 身份验证文档中的为本地开发环境设置身份验证

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证

所需的角色

创建项目、文件夹或组织时,系统会自动为您授予一个角色,可让您管理相应资源的访问权限。如需了解详情,请参阅默认政策

如果您没有创建项目、文件夹或组织,请确保您具有管理相应资源的访问权限所需的角色。

如需获得管理项目、文件夹或组织访问权限所需的权限,请让管理员向您授予您要管理其访问权限的资源(项目、文件夹或组织)的以下 IAM 角色:

  • Project IAM Admin (roles/resourcemanager.projectIamAdmin)(如需管理项目访问权限)
  • Folder Admin (roles/resourcemanager.folderAdmin)(如需管理文件夹访问权限)
  • Organization Admin (roles/resourcemanager.organizationAdmin)(如需管理项目、文件夹和组织的访问权限)
  • Security Admin (roles/iam.securityAdmin)(如需管理几乎所有 Google Cloud 资源的访问权限)

这些预定义角色包含管理项目、文件夹或组织的访问权限所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需管理对项目、文件夹或组织的访问权限,您必须拥有以下权限:

  • 如需管理项目访问权限:
    • resourcemanager.projects.getIamPolicy
    • resourcemanager.projects.setIamPolicy
  • 如需管理文件夹访问权限:
    • resourcemanager.folders.getIamPolicy
    • resourcemanager.folders.setIamPolicy
  • 如需管理组织访问权限:
    • resourcemanager.organizations.getIamPolicy
    • resourcemanager.organizations.setIamPolicy

您也可以使用自定义角色或其他预定义角色来获得这些权限。

查看当前访问权限

您可以使用 Google Cloud 控制台、gcloud CLI、REST API 或 Resource Manager 客户端库来查看谁有权访问您的项目、文件夹或组织。

控制台

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

    Google Cloud 控制台会列出已被授予您的项目、文件夹或组织的角色的所有主账号。此列表包括从父级资源继承资源角色的主账号。如需详细了解政策继承,请参阅政策继承和资源层次结构

  3. 可选:如需查看服务代理的角色授予,请选中包括 Google 提供的角色授予复选框。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如需查看谁有权访问您的项目、文件夹或组织,请获取资源的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

    如需获取资源的允许政策,请运行资源的 get-iam-policy 命令:

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    请提供以下值:

    • RESOURCE_TYPE:您要查看访问权限的资源的类型。请使用以下某个值:projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012

    • FORMAT:政策所需的格式。请使用 jsonyaml

    • PATH:指向政策的新输出文件的路径。

    例如,以下命令会获取项目 my-project 的政策,并以 JSON 格式将其保存到主目录中:

    gcloud projects get-iam-policy my-project --format=json > ~/policy.json

C#

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

如需查看谁有权访问您的项目、文件夹或组织,请获取相应资源的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

如需查看谁有权访问您的项目、文件夹或组织,请获取相应资源的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档

import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.iam.admin.v1.ProjectName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetProjectPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";

    getProjectPolicy(projectId);
  }

  // Gets a project's policy.
  public static Policy getProjectPolicy(String projectId) throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ProjectName.of(projectId).toString())
              .build();
      return projectsClient.getIamPolicy(request);
    }
  }
}

Python

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

如需查看谁有权访问您的项目、文件夹或组织,请获取相应资源的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_project_policy(project_id: str) -> policy_pb2.Policy:
    """
    Get policy for project.

    project_id: ID or number of the Google Cloud project you want to use.
    """

    client = resourcemanager_v3.ProjectsClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}"

    policy = client.get_iam_policy(request)
    return policy

REST

要查看谁有权访问您的项目、文件夹或组织,请获取资源的允许政策。如需了解如何解读允许政策,请参阅了解允许政策

Resource Manager API 的 getIamPolicy 方法可获取项目、文件夹或组织的允许政策。

在使用任何请求数据之前,请先进行以下替换:

  • API_VERSION:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • RESOURCE_TYPE:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、组织或文件夹 ID。 项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如需发送您的请求,请展开以下选项之一:

响应包含资源的允许政策。例如:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

授予或撤消单个角色

您可以使用 Google Cloud 控制台和 gcloud CLI 快速授予或撤消单个主账号的单个角色,而无需直接修改资源的允许政策。常见的主账号类型包括 Google 账号、服务账号、Google 群组和网域。如需查看所有主账号类型的列表,请参阅与身份相关的概念

政策更改通常会在 2 分钟内生效。但是,在某些情况下,更改可能需要长达 7 分钟的时间才能传播到整个系统。

如果您需要帮助来确定最合适的预定义角色,请参阅选择预定义角色

授予单个角色

如需向主账号授予单个角色,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

  3. 选择要向其授予一个角色的主账号:

    • 如需向已拥有资源的其他角色的主账号授予角色,请找到包含主账号的行,点击该行中的 修改主账号,然后点击 添加其他角色

      如需向服务代理授予角色,请选中包括 Google 提供的角色授予复选框以查看其电子邮件地址。

    • 如需向尚未拥有资源的任何角色的主账号授予角色,请点击 授予访问权限,然后输入该主账号的电子邮件地址或其他标识符。

  4. 从下拉列表中选择要授予的角色。按照确保安全性的最佳做法,请选择一个仅包含主账号所需权限的角色。

  5. 可选:为角色添加条件

  6. 点击保存。将向主账号授予资源上的角色。

如需针对多个项目、文件夹或组织向主账号授予角色,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到管理资源页面:

    转到“管理资源”

  2. 选择要为其授予权限的所有资源。

  3. 如果信息面板尚未显示,请点击显示信息面板。然后,点击权限

  4. 选择要向其授予一个角色的主账号:

    • 如需向已拥有其他角色的主账号授予角色,请找到包含主账号的行,点击该行中的 修改主账号,然后点击 添加其他角色

    • 如需向尚未拥有其他角色的主账号授予角色,请点击 添加主账号,然后输入该主账号的电子邮件地址或其他标识符。

  5. 从下拉列表中选择要授予的角色。

  6. 可选:为角色添加条件

  7. 点击保存。系统会为主账号授予各个选中资源上的所选角色。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. add-iam-policy-binding 命令使您可以快速向主账号授予角色。

    在使用下面的命令数据之前,请先进行以下替换:

    • RESOURCE_TYPE:要管理访问权限的资源类型。请使用 projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。 文件夹和组织 ID 是数字,例如 123456789012

    • PRINCIPAL:主账号(或成员)的标识符,通常其格式如下:PRINCIPAL_TYPE:ID。例如 user:my-user@example.com。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档

      对于主账号类型 user,标识符中的域名必须是 Google Workspace 网域或 Cloud Identity 网域。如需了解如何设置 Cloud Identity 网域,请参阅 Cloud Identity 概览

    • ROLE_NAME:要撤消的角色的名称。请采用以下某种格式:

      • 预定义角色:roles/SERVICE.IDENTIFIER
      • 项目级自定义角色:projects/PROJECT_ID/roles/IDENTIFIER
      • 组织级自定义角色:organizations/ORG_ID/roles/IDENTIFIER

      如需了解完整的预定义角色的列表,请参阅了解角色

    • CONDITION:要添加到角色绑定的条件。如果您不想添加条件,请使用值 None。如需详细了解条件,请参阅条件概览

    执行以下命令:

    Linux、macOS 或 Cloud Shell

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
        --member=PRINCIPAL --role=ROLE_NAME \
        --condition=CONDITION

    Windows (PowerShell)

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID `
        --member=PRINCIPAL --role=ROLE_NAME `
        --condition=CONDITION

    Windows (cmd.exe)

    gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID ^
        --member=PRINCIPAL --role=ROLE_NAME ^
        --condition=CONDITION

    响应中包含更新后的 IAM 政策。

撤消单个角色

如需撤消主账号的单个角色,请执行以下操作:

控制台

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

  3. 找到包含要撤消其访问权限的主账号的行。然后,点击该行中的 修改主账号

  4. 点击要撤消的角色对应的删除 按钮,然后点击保存

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如需快速撤消用户的角色,请运行 remove-iam-policy-binding 命令:

    gcloud RESOURCE_TYPE remove-iam-policy-binding RESOURCE_ID 
    --member=PRINCIPAL --role=ROLE_NAME

    请提供以下值:

    • RESOURCE_TYPE:要管理其访问权限的资源类型。请使用 projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。 文件夹和组织 ID 是数字,例如 123456789012

    • PRINCIPAL:主账号(或成员)的标识符,通常其格式如下:PRINCIPAL_TYPE:ID。例如 user:my-user@example.com。如需查看 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档

      对于主账号类型 user,标识符中的域名必须是 Google Workspace 网域或 Cloud Identity 网域。如需了解如何设置 Cloud Identity 网域,请参阅 Cloud Identity 概览

    • ROLE_NAME:要撤消的角色的名称。请采用以下某种格式:

      • 预定义角色:roles/SERVICE.IDENTIFIER
      • 项目级自定义角色:projects/PROJECT_ID/roles/IDENTIFIER
      • 组织级自定义角色:organizations/ORG_ID/roles/IDENTIFIER

      如需了解完整的预定义角色的列表,请参阅了解角色

    例如,如需撤消用户 my-user@example.com 在项目 my-project 中的 Project Creator 角色,请使用以下命令:

    gcloud projects remove-iam-policy-binding my-project 
    --member=user:my-user@example.com --role=roles/resourcemanager.projectCreator

为帮助确保不撤消任何必要的角色,您可以启用更改风险建议。如果您尝试撤消 Google Cloud 确定为重要角色的项目级层角色,更改风险建议会生成警告。

使用 Google Cloud 控制台授予或撤消多个角色

您可以使用 Google Cloud 控制台为单个主账号授予和撤销多个角色:

  1. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  2. 选择一个项目、文件夹或组织。

  3. 选择要修改其角色的主账号:

    • 如需修改已拥有资源角色的主账号的角色,请找到包含该主账号的行,点击该行中的 修改主账号,然后点击 添加其他角色

      如需修改服务代理的角色,请选中包括 Google 提供的角色授予复选框以查看其电子邮件地址。

    • 如需向未拥有资源的任何角色的主账号授予角色,请点击 授予访问权限,然后输入该主账号的电子邮件地址或其他标识符。

  4. 修改主账号的角色:

    • 如需向尚未拥有资源的任何角色的主账号授予角色,请点击选择角色,然后从下拉列表中选择要授予的角色。
    • 如需向主账号授予其他角色,请点击添加其他角色,然后从下拉列表中选择要授予的角色。
    • 如需将某个主账号的某个角色替换为其他角色,请点击现有角色,然后从下拉列表中选择要授予的其他角色。
    • 如需撤销主账号的某个角色,请点击要撤消的每个角色对应的删除 按钮。

    您还可以为角色添加条件修改角色的条件移除角色的条件

  5. 点击保存

以编程方式授予或撤销多个角色

如需进行涉及为多个主账号授予和撤销多个角色的大规模访问权限更改,请使用“读取-修改-写入”模式更新资源的允许政策:

  1. 通过调用 getIamPolicy() 读取当前允许政策。
  2. 使用文本编辑器或以编程方式修改允许政策,以添加或移除任何主账号或角色绑定。
  3. 通过调用 setIamPolicy() 写入更新后的允许政策。

您可以使用 gcloud CLI、REST API 或 Resource Manager 客户端库来更新允许政策。

政策更改通常会在 2 分钟内生效。但是,在某些情况下,更改可能需要长达 7 分钟的时间才能传播到整个系统。

获取当前允许政策

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如需获取资源的允许政策,请运行资源的 get-iam-policy 命令:

    gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

    请提供以下值:

    • RESOURCE_TYPE:要获取允许政策的资源类型。请使用以下某个值:projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012

    • FORMAT:允许政策所需的格式。请使用 jsonyaml

    • PATH:允许政策的新输出文件的路径。

    例如,以下命令会获取项目 my-project 的允许政策,并以 JSON 格式将其保存到主目录中:

    gcloud projects get-iam-policy my-project --format json > ~/policy.json

C#

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档

import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.iam.admin.v1.ProjectName;
import com.google.iam.v1.GetIamPolicyRequest;
import com.google.iam.v1.Policy;
import java.io.IOException;

public class GetProjectPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";

    getProjectPolicy(projectId);
  }

  // Gets a project's policy.
  public static Policy getProjectPolicy(String projectId) throws IOException {
    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      GetIamPolicyRequest request = GetIamPolicyRequest.newBuilder()
              .setResource(ProjectName.of(projectId).toString())
              .build();
      return projectsClient.getIamPolicy(request);
    }
  }
}

Python

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

以下示例展示了如何获取项目的允许政策。如需了解如何获取文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2, policy_pb2


def get_project_policy(project_id: str) -> policy_pb2.Policy:
    """
    Get policy for project.

    project_id: ID or number of the Google Cloud project you want to use.
    """

    client = resourcemanager_v3.ProjectsClient()
    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}"

    policy = client.get_iam_policy(request)
    return policy

REST

Resource Manager API 的 getIamPolicy 方法可获取项目、文件夹或组织的允许政策。

在使用任何请求数据之前,请先进行以下替换:

  • API_VERSION:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • RESOURCE_TYPE:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、组织或文件夹 ID。 项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • POLICY_VERSION:要返回的政策版本。请求应指定最新的政策版本,即政策版本 3。如需了解详情,请参阅在获取政策时指定政策版本

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy

请求 JSON 正文:

{
  "options": {
    "requestedPolicyVersion": POLICY_VERSION
  }
}

如需发送您的请求,请展开以下选项之一:

响应包含资源的允许政策。例如:

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

将响应保存在相应类型(jsonyaml)的文件中。

修改允许政策

通过编程或文本编辑器修改资源的允许政策的本地副本,以反映您要授予或撤消的角色。

为了防止覆盖其他更改,请勿修改或移除允许政策的 etag 字段。etag 字段标识允许政策的当前状态。在您设置更新后的允许政策后,IAM 会将请求中的 etag 值与现有的 etag 进行比较,并且仅当值匹配时才会写入允许政策。

如需修改允许政策授予的角色,您需要修改允许政策中的角色绑定。角色绑定采用以下格式:

{
  "role": "ROLE_NAME",
  "members": [
    "PRINCIPAL_1",
    "PRINCIPAL_2",
    ...
    "PRINCIPAL_N"
  ],
  "conditions:" {
    CONDITIONS
  }
}

占位符具有以下值:

  • ROLE_NAME:您要授予的角色的名称。请采用以下某种格式:

    • 预定义角色:roles/SERVICE.IDENTIFIER
    • 项目级自定义角色:projects/PROJECT_ID/roles/IDENTIFIER
    • 组织级自定义角色:organizations/ORG_ID/roles/IDENTIFIER

    如需了解完整的预定义角色的列表,请参阅了解角色

  • PRINCIPAL_1PRINCIPAL_2...PRINCIPAL_N:您要向其授予相应角色的主账号的标识符。

    主账号标识符通常采用以下格式:PRINCIPAL-TYPE:ID。例如 user:my-user@example.com。如需 PRINCIPAL 可以采用的值的完整列表,请参阅政策绑定参考文档

    对于主账号类型 user,标识符中的域名必须是 Google Workspace 网域或 Cloud Identity 网域。如需了解如何设置 Cloud Identity 网域,请参阅 Cloud Identity 概览

  • CONDITIONS:可选。指定何时授予访问权限的任何条件

授予角色

要向主账号授予角色,请修改允许政策中的角色绑定。如需了解您可以授予哪些角色,请参阅了解角色查看资源的可授予角色。如果您需要帮助来确定最合适的预定义角色,请参阅选择预定义角色

(可选)您可以使用条件,仅在满足特定要求时授予角色。

如需授予允许政策中已包含的角色,请将该主账号添加到现有角色绑定:

gcloud

将主账号添加到现有角色绑定,以修改返回的允许政策。此更改在您设置更新后的允许政策后才会生效。

例如,假设允许政策包含以下角色绑定,它会将 Security Reviewer 角色 (roles/iam.securityReviewer) 授予 kai@example.com

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

如需向 raha@example.com 授予相同的角色,请将 raha@example.com 添加到现有角色绑定:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

C#

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Go

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

import (
	"fmt"
	"io"

	"google.golang.org/api/iam/v1"
)

// addMember adds a member to a role binding.
func addMember(w io.Writer, policy *iam.Policy, role, member string) {
	for _, binding := range policy.Bindings {
		if binding.Role != role {
			continue
		}
		for _, m := range binding.Members {
			if m != member {
				continue
			}
			fmt.Fprintf(w, "Role %q found. Member already exists.\n", role)
			return
		}
		binding.Members = append(binding.Members, member)
		fmt.Fprintf(w, "Role %q found. Member added.\n", role)
		return
	}
	fmt.Fprintf(w, "Role %q not found. Member not added.\n", role)
}

Java

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddMember {
  public static void main(String[] args) {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();
    // TODO: Replace with your role.
    String role = "roles/existing-role";
    // TODO: Replace with your member.
    String member = "user:member-to-add@example.com";

    addMember(policy, role, member);
  }

  // Adds a member to a pre-existing role.
  public static Policy addMember(Policy policy, String role, String member) {
    List<Binding> newBindingsList = new ArrayList<>();

    for (Binding b : policy.getBindingsList()) {
      if (b.getRole().equals(role)) {
        newBindingsList.add(b.toBuilder().addMembers(member).build());
      } else {
        newBindingsList.add(b);
      }
    }

    // Update the policy to add the member.
    Policy updatedPolicy = policy.toBuilder()
            .clearBindings()
            .addAllBindings(newBindingsList)
            .build();

    System.out.println("Added member: " + updatedPolicy.getBindingsList());

    return updatedPolicy;
  }
}

Python

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

from google.iam.v1 import policy_pb2
from snippets.get_policy import get_project_policy
from snippets.set_policy import set_project_policy


def modify_policy_add_member(
    project_id: str, role: str, member: str
) -> policy_pb2.Policy:
    """
    Add a member to certain role in project policy.

    project_id: ID or number of the Google Cloud project you want to use.
    role: role to which member need to be added.
    member: The principals requesting access.

    Possible format for member:
        * user:{emailid}
        * serviceAccount:{emailid}
        * group:{emailid}
        * deleted:user:{emailid}?uid={uniqueid}
        * deleted:serviceAccount:{emailid}?uid={uniqueid}
        * deleted:group:{emailid}?uid={uniqueid}
        * domain:{domain}
    """
    policy = get_project_policy(project_id)

    for bind in policy.bindings:
        if bind.role == role:
            bind.members.append(member)
            break

    return set_project_policy(project_id, policy)

REST

将主账号添加到现有角色绑定,以修改返回的允许政策。此更改在您设置更新后的允许政策后才会生效。

例如,假设允许政策包含以下角色绑定,它会将 Security Reviewer 角色 (roles/iam.securityReviewer) 授予 kai@example.com

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

如需向 raha@example.com 授予相同的角色,请将 raha@example.com 添加到现有角色绑定:

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

如需授予允许政策中未包含的角色,请添加新的角色绑定:

gcloud

通过添加向主账号授予该角色的新角色绑定来修改允许政策。此更改在您设置更新后的允许政策后才会生效。

例如,如需向 raha@example.com 授予 Compute Storage Admin 角色 (roles/compute.storageAdmin),请将以下角色绑定添加到允许政策的 bindings 数组中:

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

C#

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM C# API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Java

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Java API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库


import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import java.util.Collections;
import java.util.List;

public class AddBinding {
  public static void main(String[] args) {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your policy: GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();
    // TODO: Replace with your role.
    String role = "roles/role-to-add";
    // TODO: Replace with your members.
    List<String> members = Collections.singletonList("user:member-to-add@example.com");

    addBinding(policy, role, members);
  }

  // Adds a member to a role.
  public static Policy addBinding(Policy policy, String role, List<String> members) {
    Binding binding = Binding.newBuilder()
            .setRole(role)
            .addAllMembers(members)
            .build();

    // Update bindings for the policy.
    Policy updatedPolicy = policy.toBuilder().addBindings(binding).build();

    System.out.println("Added binding: " + updatedPolicy.getBindingsList());

    return updatedPolicy;
  }
}

Python

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Python API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

def modify_policy_add_role(policy: dict, role: str, member: str) -> dict:
    """Adds a new role binding to a policy."""

    binding = {"role": role, "members": [member]}
    policy["bindings"].append(binding)
    print(policy)
    return policy

REST

通过添加向主账号授予该角色的新角色绑定来修改允许政策。此更改在您设置更新后的允许政策后才会生效。

例如,如需向 raha@example.com 授予 Compute Storage Admin 角色 (roles/compute.storageAdmin),请将以下角色绑定添加到允许政策的 bindings 数组中:

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

您只能授予与已激活的 API 服务相关的角色。如果某项服务(例如 Compute Engine)未处于活动状态,则无法授予与其(例如 Compute Engine)相关的特定角色。如需了解详情,请参阅启用和停用 API

在项目上授予权限时有一些独特的限制,授予 Owner (roles/owner) 角色时尤其如此。如需了解详情,请参阅 projects.setIamPolicy() 参考文档

撤消角色

如需撤消角色,请从角色绑定中移除该主账号。如果角色绑定中没有其他主账号,请移除整个角色绑定。

gcloud

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 允许政策来撤消角色。此更改在您设置更新后的允许政策后才会生效。

如需撤消主账号的角色,请从允许政策的 bindings 数组中删除主账号或绑定。

C#

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM C# API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy RemoveMember(Policy policy, string role, string member)
    {
        try
        {
            var binding = policy.Bindings.First(x => x.Role == role);
            if (binding.Members.Count != 0 && binding.Members.Contains(member))
            {
                binding.Members.Remove(member);
            }
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
            return policy;
        }
        catch (System.InvalidOperationException e)
        {
            System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
            return policy;
        }
    }
}

Go

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Go API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

import (
	"fmt"
	"io"

	"google.golang.org/api/iam/v1"
)

// removeMember removes a member from a role binding.
func removeMember(w io.Writer, policy *iam.Policy, role, member string) {
	bindings := policy.Bindings
	bindingIndex, memberIndex := -1, -1
	for bIdx := range bindings {
		if bindings[bIdx].Role != role {
			continue
		}
		bindingIndex = bIdx
		for mIdx := range bindings[bindingIndex].Members {
			if bindings[bindingIndex].Members[mIdx] != member {
				continue
			}
			memberIndex = mIdx
			break
		}
	}
	if bindingIndex == -1 {
		fmt.Fprintf(w, "Role %q not found. Member not removed.\n", role)
		return
	}
	if memberIndex == -1 {
		fmt.Fprintf(w, "Role %q found. Member not found.\n", role)
		return
	}

	members := removeIdx(bindings[bindingIndex].Members, memberIndex)
	bindings[bindingIndex].Members = members
	if len(members) == 0 {
		bindings = removeIdx(bindings, bindingIndex)
		policy.Bindings = bindings
	}
	fmt.Fprintf(w, "Role %q found. Member removed.\n", role)
}

// removeIdx removes arr[idx] from arr.
func removeIdx[T any](arr []T, idx int) []T {
	return append(arr[:idx], arr[idx+1:]...)
}

Java

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Java API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class RemoveMember {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();
    // TODO: Replace with your role.
    String role = "roles/existing-role";
    // TODO: Replace with your member.
    String member = "user:member-to-add@example.com";

    removeMember(policy, role, member);
  }

  // Removes member from a role; removes binding if binding contains no members.
  public static Policy removeMember(Policy policy, String role, String member) {
    // Creating new builder with all values copied from origin policy
    Policy.Builder policyBuilder = policy.toBuilder();

    // Getting binding with suitable role.
    Binding binding = null;
    for (Binding b : policy.getBindingsList()) {
      if (b.getRole().equals(role)) {
        binding = b;
        break;
      }
    }

    if (binding != null && binding.getMembersList().contains(member)) {
      List<String> newMemberList = new ArrayList<>(binding.getMembersList());
      // Removing member from a role
      newMemberList.remove(member);

      System.out.println("Member " + member + " removed from " + role);

      // Adding all remaining members to create new binding
      Binding newBinding = binding.toBuilder()
              .clearMembers()
              .addAllMembers(newMemberList)
              .build();

      List<Binding> newBindingList = new ArrayList<>(policyBuilder.getBindingsList());

      // Removing old binding to replace with new one
      newBindingList.remove(binding);

      // If binding has no more members, binding will not be added
      if (!newBinding.getMembersList().isEmpty()) {
        newBindingList.add(newBinding);
      }

      // Update the policy to remove the member.
      policyBuilder.clearBindings()
              .addAllBindings(newBindingList);
    }

    Policy updatedPolicy = policyBuilder.build();

    System.out.println("Exising members: " + updatedPolicy.getBindingsList());

    return updatedPolicy;
  }
}

Python

如需了解如何安装和使用 IAM 客户端库,请参阅 IAM 客户端库。 如需了解详情,请参阅 IAM Python API 参考文档

如需向 IAM 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅准备工作

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

from google.iam.v1 import policy_pb2
from snippets.get_policy import get_project_policy
from snippets.set_policy import set_project_policy


def modify_policy_remove_member(
    project_id: str, role: str, member: str
) -> policy_pb2.Policy:
    """
    Remove a member from certain role in project policy.

    project_id: ID or number of the Google Cloud project you want to use.
    role: role to which member need to be added.
    member: The principals requesting access.

    Possible format for member:
        * user:{emailid}
        * serviceAccount:{emailid}
        * group:{emailid}
        * deleted:user:{emailid}?uid={uniqueid}
        * deleted:serviceAccount:{emailid}?uid={uniqueid}
        * deleted:group:{emailid}?uid={uniqueid}
        * domain:{domain}
    """
    policy = get_project_policy(project_id)

    for bind in policy.bindings:
        if bind.role == role:
            if member in bind.members:
                bind.members.remove(member)
            break

    return set_project_policy(project_id, policy, False)

REST

通过修改由 get-iam-policy 命令返回的 JSON 或 YAML 允许政策来撤消角色。此更改在您设置更新后的允许政策后才会生效。

如需撤消主账号的角色,请从允许政策的 bindings 数组中删除主账号或绑定。

设置允许政策

修改允许政策以授予和撤消角色后,请调用 setIamPolicy() 更新该政策。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. 如需设置资源的允许政策,请针对资源运行 set-iam-policy 命令:

    gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

    请提供以下值:

    • RESOURCE_TYPE:您要设置允许政策的资源的类型。请使用以下某个值:projectsresource-manager foldersorganizations

    • RESOURCE_ID:您的 Google Cloud 项目、文件夹或组织 ID。项目 ID 为字母数字,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012

    • PATH:包含新允许政策的文件的路径。

    响应包含更新后的允许政策。

    例如,以下命令将存储在 policy.json 中的允许政策设置为项目 my-project 的允许政策:

    gcloud projects set-iam-policy my-project ~/policy.json

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Java

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

以下示例展示了如何设置项目的允许政策。如需了解如何设置文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档

import com.google.cloud.resourcemanager.v3.ProjectsClient;
import com.google.iam.admin.v1.ProjectName;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class SetProjectPolicy {
  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace the variables before running the sample.
    // TODO: Replace with your project ID.
    String projectId = "your-project-id";
    // TODO: Replace with your policy, GetPolicy.getPolicy(projectId, serviceAccount).
    Policy policy = Policy.newBuilder().build();

    setProjectPolicy(policy, projectId);
  }

  // Sets a project's policy.
  public static Policy setProjectPolicy(Policy policy, String projectId)
          throws IOException {

    // Initialize client that will be used to send requests.
    // This client only needs to be created once, and can be reused for multiple requests.
    try (ProjectsClient projectsClient = ProjectsClient.create()) {
      List<String> paths = Arrays.asList("bindings", "etag");
      SetIamPolicyRequest request = SetIamPolicyRequest.newBuilder()
              .setResource(ProjectName.of(projectId).toString())
              .setPolicy(policy)
              // A FieldMask specifying which fields of the policy to modify. Only
              // the fields in the mask will be modified. If no mask is provided, the
              // following default mask is used:
              // `paths: "bindings, etag"`
              .setUpdateMask(FieldMask.newBuilder().addAllPaths(paths).build())
              .build();

      return projectsClient.setIamPolicy(request);
    }
  }
}

Python

如需向 Resource Manager 进行身份验证,请设置应用默认凭据。 如需了解更多信息,请参阅准备工作

如需了解如何安装和使用 Resource Manager 客户端库,请参阅 Resource Manager 客户端库

以下示例展示了如何设置项目的允许政策。如需了解如何设置文件夹或组织的允许政策,请查看适合您的编程语言的 Resource Manager 客户端库文档

from google.cloud import resourcemanager_v3
from google.iam.v1 import iam_policy_pb2, policy_pb2


def set_project_policy(
    project_id: str, policy: policy_pb2.Policy, merge: bool = True
) -> policy_pb2.Policy:
    """
    Set policy for project. Pay attention that previous state will be completely rewritten.
    If you want to update only part of the policy follow the approach read->modify->write.
    For more details about policies check out https://cloud.google.com/iam/docs/policies

    project_id: ID or number of the Google Cloud project you want to use.
    policy: Policy which has to be set.
    merge: The strategy to be used forming the request. CopyFrom is clearing both mutable and immutable fields,
    when MergeFrom is replacing only immutable fields and extending mutable.
    https://googleapis.dev/python/protobuf/latest/google/protobuf/message.html#google.protobuf.message.Message.CopyFrom
    """
    client = resourcemanager_v3.ProjectsClient()

    request = iam_policy_pb2.GetIamPolicyRequest()
    request.resource = f"projects/{project_id}"
    current_policy = client.get_iam_policy(request)

    # Etag should as fresh as possible to lower chance of collisions
    policy.ClearField("etag")
    if merge:
        current_policy.MergeFrom(policy)
    else:
        current_policy.CopyFrom(policy)

    request = iam_policy_pb2.SetIamPolicyRequest()
    request.resource = f"projects/{project_id}"

    # request.etag field also will be merged which means you are secured from collision,
    # but it means that request may fail and you need to leverage exponential retries approach
    # to be sure policy has been updated.
    request.policy.CopyFrom(current_policy)

    policy = client.set_iam_policy(request)
    return policy

REST

Resource Manager API 的 setIamPolicy 方法会将请求中的政策设置为项目、文件夹或组织的新允许政策。

在使用任何请求数据之前,请先进行以下替换:

  • API_VERSION:要使用的 API 版本。对于项目和组织,请使用 v1。对于文件夹,请使用 v2
  • RESOURCE_TYPE:您要管理其政策的资源类型。使用值 projectsfoldersorganizations
  • RESOURCE_ID:您的 Google Cloud 项目、组织或文件夹 ID。 项目 ID 是字母数字字符串,例如 my-project。文件夹和组织 ID 是数字,例如 123456789012
  • POLICY:您要设置的政策的 JSON 格式。如需详细了解政策的格式,请参阅政策参考文档

HTTP 方法和网址:

POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

请求 JSON 正文:

{
  "policy": POLICY
}

如需发送您的请求,请展开以下选项之一:

响应包含更新后的允许政策。

后续步骤

自行试用

如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费开始使用