Testar permissões para interfaces de usuário personalizadas

A maioria dos Google Cloud recursos 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 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 permitido 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 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 Google Cloud com base no que o usuário autenticado tem permissão para ver. Por exemplo, o console do Google 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 Google Cloud oculta ou expõe os itens adequadamente.

Antes de começar

Funções exigidas

Nenhum papel do IAM é necessário para testar as permissões.

Como testar permissões

Este exemplo mostra como testar as permissões resourcemanager.projects.get e resourcemanager.projects.delete para um projetoGoogle Cloud . Para testar as permissões de outros recursos 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.

C++

Para saber como instalar e usar a biblioteca de cliente do IAM, consulte Bibliotecas de cliente do IAM. Para mais informações, consulte a documentação de referência da API C++ do IAM.

Para autenticar no IAM, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

namespace iam = ::google::cloud::iam_admin_v1;
[](std::string const& name, std::vector<std::string> const& permissions) {
  iam::IAMClient client(iam::MakeIAMConnection());
  auto response = client.TestIamPermissions(name, permissions);
  if (!response) throw std::move(response).status();
  std::cout << "Permissions successfully tested: " << response->DebugString()
            << "\n";
}

C#

Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

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

Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

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

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.TestIamPermissionsRequest;
import com.google.api.services.cloudresourcemanager.v3.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(),
                GsonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Para autenticar no Resource Manager, configure o Application Default Credentials. Para mais informações, consulte Antes de começar.

Para saber como instalar e usar a biblioteca de cliente do Resource Manager, consulte Bibliotecas de cliente do Resource Manager.

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

def test_permissions(project_id: str) -> List[str]:
    """Tests IAM permissions of currently authenticated user to a project."""

    projects_client = resourcemanager_v3.ProjectsClient()
    if not project_id.startswith("projects/"):
        project_id = "projects/" + project_id

    owned_permissions = projects_client.test_iam_permissions(
        resource=project_id,
        permissions=["resourcemanager.projects.get", "resourcemanager.projects.delete"],
    ).permissions

    print("Currently authenticated user has following permissions:", owned_permissions)
    return owned_permissions

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 principal tem.

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

  • PROJECT_ID: o ID do projeto Google Cloud . Os IDs do projeto são strings alfanuméricas, como my-project.

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"
  ]
}

A seguir

Saiba como conceder, alterar e revogar acesso a principais.