Como testar permissões

A maioria dos recursos do Google Cloud expõe o método testIamPermissions(), que permite verificar programaticamente se o autor da chamada autenticado recebeu uma ou mais permissões específicas do IAM no recurso. 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 dado ao autor da chamada.

É possível usar o método testIamPermissions() para determinar se um usuário deve ter acesso a uma ferramenta administrativa em um aplicativo da Web. Por exemplo, é possível usar esse método para decidir, com base nas permissões do usuário, se serão exibidas informações detalhadas sobre um recurso do Google Cloud.

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 IAM para um bucket do Cloud Storage.

API REST

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

O método projects.testIamPermissions da API Resource Manager aceita uma lista de permissões e testa qual permissão um membro tem.

Antes de usar os dados da solicitação abaixo, faça as substituições a seguir:

  • project-id: o ID do projeto do Google Cloud.

Método HTTP e URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:testIamPermissions

Corpo JSON da solicitação:

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

Para enviar a solicitação, expanda uma destas opções:

Você receberá uma resposta JSON semelhante a esta:

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

C#

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

O 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 esta amostra, siga as instruções de configuração do Java no Guia de início rápido do IAM: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API IAM para Java.

O IAM testa as permissões da conta de serviço que você está usando para gerar credenciais.
Ver no GitHub (em inglês) Feedback
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 com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
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
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

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

Python

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

O 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.