Prueba permisos para interfaces de usuario personalizadas

La mayoría de los recursos de Google Cloud exponen el método testIamPermissions(), que te permite comprobar de manera programática si el emisor autenticado actual tiene uno o más permisos de IAM específicos en el recurso. El método testIamPermissions() toma un identificador de recursos y un conjunto de permisos como parámetros de entrada y muestra el conjunto de permisos habilitados para el emisor.

Puedes usar el método testIamPermissions() para determinar si un usuario debe tener acceso a una herramienta administrativa en una aplicación web. Por ejemplo, puedes usar este método para decidir, en función de los permisos del usuario, si deseas mostrar información detallada sobre un recurso de Google Cloud.

Por ejemplo, si quieres determinar si el usuario autenticado actual tiene permiso para borrar un proyecto, llama al método projects.testIamPermissions() mediante el ID del proyecto (por ejemplo, foo-project) y el permiso resourcemanager.projects.delete como parámetros de entrada. Si se le otorgó el permiso resourcemanager.projects.delete al emisor, se lo incluirá en el cuerpo de la respuesta. Si el emisor no tiene este permiso, el cuerpo de la respuesta no mostrará ningún permiso.

El método testIamPermissions() está orientado a interfaces gráficas de usuario (GUI) de terceros que necesitan mostrar recursos de Google Cloud según lo que el usuario autenticado tenga permiso para ver. Por ejemplo, en la consola de Google Cloud se usa el método testIamPermissions() a nivel interno a fin de determinar qué recursos y funciones son visibles para ti después de la autenticación. En general, los diferentes usuarios tienen distintos permisos, y la consola de Google Cloud los oculta o expone según corresponda.

Antes de comenzar

  • Enable the Resource Manager API.

    Enable the API

  • Configura la autenticación.

    Select the tab for how you plan to use the samples on this page:

    C#

    Para usar las muestras de .NET de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local en la documentación de autenticación de Google Cloud.

    C++

    Para usar las muestras de C++ de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local en la documentación de autenticación de Google Cloud.

    Java

    Para usar las muestras de Java de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local en la documentación de autenticación de Google Cloud.

    Python

    Para usar las muestras de Python de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

    1. Install the Google Cloud CLI.
    2. To initialize the gcloud CLI, run the following command:

      gcloud init
    3. If you're using a local shell, then create local authentication credentials for your user account:

      gcloud auth application-default login

      You don't need to do this if you're using Cloud Shell.

    Si deseas obtener más información, consulta Configura ADC para un entorno de desarrollo local en la documentación de autenticación de Google Cloud.

    REST

    Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

      Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init

    Si deseas obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud.

Roles obligatorios

No se requiere ningún rol de IAM para probar los permisos.

Cómo probar permisos

En este ejemplo, se muestra cómo probar los permisos resourcemanager.projects.get y resourcemanager.projects.delete para un proyecto de Google Cloud. Para probar los permisos de otros recursos de Google Cloud, debes usar el método testIamPermissions() que expone cada recurso. Por ejemplo, puedes probar los permisos de IAM para un depósito de Cloud Storage.

C++

Para obtener más obtener información sobre cómo instalar y usar la biblioteca cliente de IAM, consulta Bibliotecas cliente de IAM. Para obtener más información, consulta la documentación de referencia de la API de IAM C++.

Para autenticarte en IAM, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

IAM prueba los permisos de la cuenta de servicio que usas para generar credenciales.


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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

IAM prueba los permisos de la cuenta de servicio que usas para generar credenciales.

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 autenticarte en Resource Manager, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Antes de comenzar.

Si deseas obtener información para instalar y usar la biblioteca cliente de Resource Manager, consulta las bibliotecas cliente de Resource Manager.

IAM prueba los permisos de la cuenta de servicio que usas para generar credenciales.

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

En este ejemplo, el usuario tiene una función de IAM que le permite obtener información sobre un proyecto, pero no borrarlo.

El método projects.testIamPermissions de la API de Resource Manager acepta una lista de permisos y prueba qué permisos tiene un miembro.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • PROJECT_ID: El ID del proyecto de Google Cloud Los ID de proyecto son strings alfanuméricas, como my-project.

Método HTTP y URL:

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

Cuerpo JSON de la solicitud:

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

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

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

¿Qué sigue?

Obtén más información para otorgar, cambiar y revocar el acceso a las principales.