Como testar permissões

A maioria dos recursos do Google Cloud expõe o método testIamPermissions(), que permite verificar se o autor da chamada autenticado atualmente recebeu uma ou mais permissões específicas do Cloud IAM. O método testIamPermissions() usa um identificador de recurso e um conjunto de permissões como parâmetros de entrada e retorna o conjunto de permissões permitido pelo autor da chamada.

Por exemplo, para determinar se o usuário atualmente autenticado tem permissão para excluir um projeto, chame o projects.testIamPermissions() usando o ID do projeto, como foo-project, e a permissão resourcemanager.projects.delete como parâmetros de entrada. Se o autor da chamada tiver recebido a permissão resourcemanager.projects.delete, ele será listado no corpo da resposta. Se o autor da chamada não tiver essa permissão, o corpo da resposta não listará nenhuma permissão.

O método testIamPermissions() destina-se a interfaces gráficas do usuário (GUIs) de terceiros que precisam exibir recursos do Google Cloud com base no que o usuário autenticado tem permissão para ver. Por exemplo, o Console do Cloud usa internamente o método testIamPermissions() para determinar quais recursos e funcionalidades ficam visíveis para você após a autenticação. Normalmente, usuários diferentes recebem permissões distintas, e o Console do Cloud oculta ou expõe os itens adequadamente.

Como testar permissões

Este exemplo mostra como testar as permissões resourcemanager.projects.get e resourcemanager.projects.delete para um projeto do Google Cloud. Para testar as permissões de outros recursos do Google Cloud, use o método testIamPermissions() exposto por cada recurso. Por exemplo, é possível testar as permissões do Cloud IAM para o intervalo do Cloud Storage.

API REST

Consulte o método projects.testIamPermissions() da API Resource Manager para mais informações.

Neste exemplo, o usuário tem um papel do Cloud IAM que permite que ele receba informações sobre um projeto, mas não para excluir projetos.

Solicitação (substitua o ID do projeto do Google Cloud por [PROJECT_ID]):

POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:testIamPermissions

{
    "permissions":  [
        "resourcemanager.projects.get",
        "resourcemanager.projects.delete"
    ]
}

Resposta:

{
    "permissions": [
        "resourcemanager.projects.get"
    ]
}

C#

Antes de testar este exemplo, siga as instruções de configuração do C# no Guia de início rápido do Cloud IAM: como usar as bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Cloud IAM para C#.

O Cloud IAM testa as permissões da conta de serviço que você está usando para gerar credenciais.

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

public partial class AccessManager
{
    public static IList<String> TestIamPermissions(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        TestIamPermissionsRequest requestBody = new TestIamPermissionsRequest();
        var permissions = new List<string>() { "resourcemanager.projects.get", "resourcemanager.projects.delete" };
        requestBody.Permissions = new List<string>(permissions);
        var returnedPermissions = service.Projects.TestIamPermissions(requestBody, projectId).Execute().Permissions;

        return returnedPermissions;
    }
}

Java

Antes de testar este exemplo, siga as instruções de configuração do Java no Guia de início rápido do Cloud IAM: como usar as bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Cloud IAM para Java.

O Cloud IAM testa as permissões da conta de serviço que você está usando para gerar credenciais.
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.TestIamPermissionsRequest;
import com.google.api.services.cloudresourcemanager.model.TestIamPermissionsResponse;
import com.google.api.services.iam.v1.IamScopes;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class TestPermissions {

  // Tests if the caller has the listed permissions.
  public static void testPermissions(String projectId) {
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    List<String> permissionsList =
        Arrays.asList("resourcemanager.projects.get", "resourcemanager.projects.delete");

    TestIamPermissionsRequest requestBody =
        new TestIamPermissionsRequest().setPermissions(permissionsList);
    try {
      TestIamPermissionsResponse testIamPermissionsResponse =
          service.projects().testIamPermissions(projectId, requestBody).execute();

      System.out.println(
          "Of the permissions listed in the request, the caller has the following: "
              + testIamPermissionsResponse.getPermissions().toString());
    } catch (IOException e) {
      System.out.println("Unable to test permissions: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredential credential =
        GoogleCredential.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                credential)
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Antes de testar este exemplo, siga as instruções de configuração do Python no Guia de início rápido do Cloud IAM: como usar as bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Cloud IAM para Python.

O Cloud IAM testa as permissões da conta de serviço que você está usando para gerar credenciais.
def test_permissions(project_id):
    """Tests IAM permissions of the caller"""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    service = googleapiclient.discovery.build(
        'cloudresourcemanager', 'v1', credentials=credentials)

    permissions = {
        "permissions": [
            "resourcemanager.projects.get",
            "resourcemanager.projects.delete"
        ]
    }

    request = service.projects().testIamPermissions(
        resource=project_id, body=permissions)
    returnedPermissions = request.execute()
    print(returnedPermissions)
    return returnedPermissions

A seguir

Saiba como conceder, alterar e revogar acesso a membros do projeto.