查看可为资源授予的角色

针对某项资源为用户授予 IAM 角色之前,您可能想知道对于某项特定资源可以授予哪些角色。

了解可授予哪些角色

如果某个角色包含某种资源类型的任何权限,则可以针对该资源或其上层资源授予该角色。例如,storage.admin 角色授予storage.buckets.getstorage.objects.get API 的权限,因此可以针对Storage BucketsStorage Objects资源类型授予该角色。

在定义角色权限的资源类型的“上层”也可以授予这些角色。换句话说,可以针对位于 Google Cloud 资源层次结构中较高级层的资源授予较低层级资源的角色。以storage.admin 角色为例,除了Storage Buckets外,您还可以在项目或组织级层授予该角色。

按角色授予的权限只会影响指定级层或更低级层的资源,而不会影响更高级层的资源或同级资源。此外,针对资源授予某项角色时,无论该角色的名称、说明或其包含的其他权限是什么,系统仅会授予适用于指定资源的权限。例如,在项目级层将角色 resourcemanager.organizationAdmin(该角色授予 resourcemanager.projects.list 权限)分配给用户,只会为他们授予该特定项目的权限。而允许他们列出或管理组织中的所有项目。同样,在特定 Compute Engine 实例上分配 compute.admin 角色只会为该实例(而不会为项目中的其他实例)授予权限。

列出可授予的角色

在列出可授予的角色之前,请确保已在项目中启用了服务。如果尚未启用服务,则不会返回其角色。

控制台

  1. 在 Cloud Console 中打开 IAM 页面。

    打开IAM 页面

  2. 点击页面顶部的“选择项目”下拉列表。
  3. 选择要查看其角色的项目或组织。
  4. 点击添加
  5. 成员中输入成员电子邮件或网域。

选择角色下拉菜单会显示针对此资源您可以为成员授予的所有角色(包括自定义角色)。

gcloud 命令

使用 gcloud iam list-grantable-roles命令返回可应用于给定资源的所有角色的列表。

    gcloud iam list-grantable-roles [FULL-RESOURCE-NAME]
    

系统可能会返回大量角色,具体取决于所需的资源。如需限制结果数量,您可以指定过滤条件表达式

输出结果如下所示:

description: Full control of all Compute Engine resources.
    name: roles/compute.admin
    title: Compute Admin
    ---
    description: Full control of Compute Engine instance resources.
    name: roles/compute.instanceAdmin
    title: Compute Instance Admin

    # Additional results here...
    

REST API

QueryGrantableRoles会返回针对某个资源可授予的所有角色的列表。

请求:

    POST https://iam.googleapis.com/v1/roles:queryGrantableRoles
    

正文:

{
        "fullResourceName": [FULL-RESOURCE-NAME]
    }
    

响应:

{
        "roles": [
            {
                "name": "roles/compute.admin",
                "title": "Compute Admin",
                "description": "Full control of all Compute Engine resources."
            },
            {
                "name": "roles/compute.instanceAdmin",
                "title": "Compute Instance Admin (beta)",
                "description": "Full control of Compute Engine instance resources."
            }
            // Additional results here...
        ]
    }
    

C#

在试用此示例之前,请按照《Cloud IAM 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅Cloud IAM C# API 参考文档


    using System;
    using System.Collections.Generic;
    using Google.Apis.Auth.OAuth2;
    using Google.Apis.Iam.v1;
    using Google.Apis.Iam.v1.Data;

    public partial class CustomRoles
    {
        public static IList<Role> ViewGrantableRoles(string fullResourceName)
        {
            var credential = GoogleCredential.GetApplicationDefault()
                .CreateScoped(IamService.Scope.CloudPlatform);
            var service = new IamService(new IamService.Initializer
            {
                HttpClientInitializer = credential
            });

            var request = new QueryGrantableRolesRequest
            {
                FullResourceName = fullResourceName
            };
            var response = service.Roles.QueryGrantableRoles(request).Execute();
            foreach (var role in response.Roles)
            {
                Console.WriteLine("Title: " + role.Title);
                Console.WriteLine("Name: " + role.Name);
                Console.WriteLine("Description: " + role.Description);
                Console.WriteLine();
            }
            return response.Roles;
        }
    }

Go

在试用此示例之前,请按照《Cloud IAM 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅Cloud IAM Go API 参考文档

import (
    	"context"
    	"fmt"
    	"io"

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

    // viewGrantableRoles lists roles grantable on a resource.
    func viewGrantableRoles(w io.Writer, fullResourceName string) ([]*iam.Role, error) {
    	ctx := context.Background()
    	service, err := iam.NewService(ctx)
    	if err != nil {
    		return nil, fmt.Errorf("iam.NewService: %v", err)
    	}

    	request := &iam.QueryGrantableRolesRequest{
    		FullResourceName: fullResourceName,
    	}
    	response, err := service.Roles.QueryGrantableRoles(request).Do()
    	if err != nil {
    		return nil, fmt.Errorf("Roles.QueryGrantableRoles: %v", err)
    	}
    	for _, role := range response.Roles {
    		fmt.Fprintf(w, "Found grantable role: %v\n", role.Name)
    	}
    	return response.Roles, err
    }
    

Java

在试用此示例之前,请按照《Cloud IAM 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅Cloud IAM Java API 参考文档

QueryGrantableRolesRequest request = new QueryGrantableRolesRequest();
    request.setFullResourceName(fullResourceName);

    QueryGrantableRolesResponse response = service.roles().queryGrantableRoles(request).execute();

    for (Role role : response.getRoles()) {
      System.out.println("Title: " + role.getTitle());
      System.out.println("Name: " + role.getName());
      System.out.println("Description: " + role.getDescription());
      System.out.println();
    }

Python

在试用此示例之前,请按照《Cloud IAM 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅Cloud IAM Python API 参考文档

def view_grantable_roles(full_resource_name):
        roles = service.roles().queryGrantableRoles(body={
            'fullResourceName': full_resource_name
        }).execute()

        for role in roles['roles']:
            if 'title' in role:
                print('Title: ' + role['title'])
            print('Name: ' + role['name'])
            print('Description: ' + role['description'])
            print(' ')

在上面的示例中,完整资源名称是无传输协议的 URI,由与 DNS 兼容的 API 服务名称和资源路径组成。

例如,要返回针对项目可授予的所有角色,请使用:

//cloudresourcemanager.googleapis.com/projects/[PROJECT-ID]
    

较低层级资源具有更详细的完全限定名称。例如,使用以下命令可返回针对 Compute Engine 实例可授予的所有角色:

//compute.googleapis.com/projects/[PROJECT-ID]/zones/[ZONE-NAME]/instances/[INSTANCE-ID]
    

后续步骤