Test delle autorizzazioni

La maggior parte delle risorse Google Cloud espone il metodo testIamPermissions(), che consente di verificare a livello di programmazione se al chiamante attualmente autenticato sono state concesse una o più autorizzazioni IAM specifiche sulla risorsa. Il metodo testIamPermissions() prevede un identificatore di risorse e una serie di autorizzazioni come parametri di input e restituisce la serie di autorizzazioni consentite al chiamante.

Puoi utilizzare il metodo testIamPermissions() per stabilire se un utente deve avere accesso a uno strumento amministrativo in un'applicazione web. Ad esempio, puoi utilizzare questo metodo per decidere, in base alle autorizzazioni dell'utente, se visualizzare o meno informazioni dettagliate su una risorsa di Google Cloud.

Ad esempio, per determinare se l'utente attualmente autenticato ha l'autorizzazione per eliminare un progetto, chiama il metodo projects.testIamPermissions() fornendo l'ID progetto (come foo-project) e l'autorizzazione resourcemanager.projects.delete come parametri di input. Se al chiamante è stata concessa l'autorizzazione resourcemanager.projects.delete, verrà elencata nel corpo della risposta. Se il chiamante non dispone di questa autorizzazione, il corpo della risposta non mostrerà alcuna autorizzazione.

Il metodo testIamPermissions() è studiato per le interfacce utente grafiche di terze parti (GUI) che devono visualizzare le risorse di Google Cloud in base alle autorizzazioni di visualizzazione dell'utente autenticato. Ad esempio, Cloud Console utilizza internamente il metodo testIamPermissions() per determinare quali risorse e funzionalità sono visibili dopo l'autenticazione. A utenti diversi vengono in genere concesse autorizzazioni diverse e Cloud Console nasconde o espone gli elementi di conseguenza.

Prima di iniziare

  • Attiva Resource Manager API.

    Abilita l'API

Ruoli obbligatori

Non è richiesto alcun ruolo IAM per testare le autorizzazioni.

Come testare le autorizzazioni

Questo esempio mostra come testare le autorizzazioni resourcemanager.projects.get e resourcemanager.projects.delete per un progetto Google Cloud. Per testare le autorizzazioni per altre risorse Google Cloud, utilizza il metodo testIamPermissions() esposto da ciascuna risorsa. Ad esempio, puoi testare le autorizzazioni IAM per un bucket Cloud Storage.

REST

In questo esempio, l'utente ha un ruolo IAM che consente di recuperare informazioni su un progetto, ma non di eliminarlo.

Il metodo projects.testIamPermissions dell'API Resource Manager accetta un elenco di autorizzazioni e verifica quale delle autorizzazioni dispone di un'entità.

Prima di utilizzare uno qualsiasi dei dati della richiesta, effettua le seguenti sostituzioni:

  • PROJECT_ID: ID progetto Google Cloud. Gli ID progetto sono stringhe alfanumeriche, come my-project.

Metodo HTTP e URL:

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

Corpo JSON richiesta:

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

Per inviare la richiesta, espandi una delle seguenti opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

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

C++

Per informazioni su come installare e utilizzare la libreria client per IAM, consulta le librerie client IAM. Per maggiori informazioni, consulta la documentazione di riferimento dell'API IAM C++.

namespace iam = ::google::cloud::iam;
[](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::runtime_error(response.status().message());
  std::cout << "Permissions successfully tested: " << response->DebugString()
            << "\n";
}

C#

Per informazioni su come installare e utilizzare la libreria client per IAM, consulta le librerie client IAM. Per maggiori informazioni, consulta la documentazione di riferimento dell'API IAM C# .

IAM verifica le autorizzazioni dell'account di servizio che utilizzi per generare le credenziali.

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

Per informazioni su come installare e utilizzare la libreria client per IAM, consulta le librerie client IAM. Per maggiori informazioni, consulta la documentazione di riferimento dell'API Java IAM.

IAM verifica le autorizzazioni dell'account di servizio che utilizzi per generare le credenziali.
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
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(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

Per informazioni su come installare e utilizzare la libreria client per IAM, consulta le librerie client IAM. Per maggiori informazioni, consulta la documentazione di riferimento dell'API Python IAM.

IAM verifica le autorizzazioni dell'account di servizio che utilizzi per generare le credenziali.
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

Passaggi successivi

Scopri come concedere, modificare e revocare l'accesso alle entità.