Cómo probar permisos

La mayoría de los recursos de Google Cloud exponen el método testIamPermissions(), que te permite comprobar si el emisor autenticado actual tiene uno o más permisos específicos de Cloud IAM 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.

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 Cloud Console 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 Cloud Console los oculta o expone según corresponda.

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 Cloud IAM para un depósito de Cloud Storage.

API de REST

Consulta el método projects.testIamPermissions() de la API de Resource Manager para obtener más información.

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

Solicitud (sustituye tu ID del proyecto de Google Cloud por [PROJECT_ID]):

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

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

Respuesta:

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

C#

Antes de probar esta muestra, sigue las instrucciones de configuración para C# que aparecen en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para C#.

Cloud IAM comprueba 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

Antes de probar esta muestra, sigue las instrucciones de configuración para Java que se encuentran en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Java.

Cloud IAM comprueba los permisos de la cuenta de servicio que usas para generar credenciales.
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 probar este ejemplo, sigue las instrucciones de configuración para Python que aparecen en la Guía de inicio rápido de Cloud IAM con bibliotecas cliente. Si quieres obtener más información, consulta la documentación de referencia de la API de Cloud IAM para Python.

Cloud IAM comprueba los permisos de la cuenta de servicio que usas para generar credenciales.
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

Próximos pasos

Aprende cómo otorgar, cambiar y revocar el acceso a los miembros del proyecto.