Teste de 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 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.

Você pode 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, você pode usar esse método para decidir, com base nas permissões do usuário, se deseja exibir 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 aparecerá no corpo da resposta. Se o autor da chamada não tiver essa permissão, o corpo da resposta não mostrará 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

Neste exemplo, mostramos 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 um 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 lhe permite receber 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
    

Body:

{
        "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 saber 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.
Ver no GitHub (em inglês) Feedback
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.