Tester les autorisations pour les interfaces utilisateur personnalisées

La plupart des ressources Google Cloud exposent la méthode testIamPermissions(), qui permet de vérifier de manière automatisée si l'appelant actuellement authentifié s'est vu accorder une ou plusieurs autorisations IAM spécifiques sur la ressource. La méthode testIamPermissions() prend comme paramètres d'entrée un identifiant de ressource et un ensemble d'autorisations, et renvoie l'ensemble d'autorisations dont dispose l'auteur de l'appel.

La méthode testIamPermissions() permet de déterminer si un utilisateur doit disposer de l'accès à un outil administratif dans une application Web. Par exemple, cette méthode peut vous permettre de décider, en fonction des autorisations de l'utilisateur, d'afficher ou non des informations détaillées sur une ressource Google Cloud.

Par exemple, pour déterminer si l'utilisateur actuellement authentifié est autorisé à supprimer un projet, appelez la méthode projects.testIamPermissions() en fournissant l'ID de projet (tel que foo-project) et l'autorisation resourcemanager.projects.delete en tant que paramètres d'entrée. Si l'auteur de l'appel a obtenu l'autorisation resourcemanager.projects.delete, il est répertorié dans le corps de la réponse. Si l'auteur de l'appel ne dispose pas de cette autorisation, le corps de la réponse ne liste aucune autorisation.

La méthode testIamPermissions() est destinée aux interfaces utilisateurs graphiques tierces qui doivent afficher les ressources Google Cloud en fonction de ce que l'utilisateur authentifié est autorisé à voir. Par exemple, la console Google Cloud utilise en interne la méthode testIamPermissions() pour déterminer quelles ressources et fonctionnalités sont visibles pour vous après votre authentification. Différents utilisateurs bénéficient généralement de permissions différentes, et la console Google Cloud masque ou affiche les éléments en conséquence.

Avant de commencer

  • Activez Resource Manager API.

    Activer l'API

Rôles requis

Aucun rôle IAM n'est requis pour tester les autorisations.

Comment tester les autorisations

Cet exemple montre comment tester les autorisations resourcemanager.projects.get et resourcemanager.projects.delete pour un projet Google Cloud. Pour tester les autorisations des autres ressources Google Cloud, utilisez la méthode testIamPermissions() exposée par chaque ressource. Par exemple, vous pouvez tester les autorisations IAM pour un bucket Cloud Storage.

REST

Dans cet exemple, l'utilisateur dispose d'un rôle IAM lui permettant d'obtenir des informations sur un projet, mais pas de supprimer des projets.

La méthode projects.testIamPermissions de l'API Resource Manager accepte une liste d'autorisations et teste celles dont dispose un compte principal.

Avant d'utiliser les données de requête ci-dessous, effectuez les remplacements suivants :

  • PROJECT_ID : ID de votre projet Google Cloud. Les ID de projet sont des chaînes alphanumériques, telles que my-project.

Méthode HTTP et URL :

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

Corps JSON de la requête :

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

Pour envoyer votre requête, développez l'une des options suivantes :

Vous devriez recevoir une réponse JSON de ce type :

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

C++

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM C++.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour un environnement de développement local.

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#

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM C#.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Cloud IAM teste les autorisations du compte de service que vous utilisez pour générer des identifiants.

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

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM Java.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Cloud IAM teste les autorisations du compte de service que vous utilisez pour générer des identifiants.
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

Pour savoir comment installer et utiliser la bibliothèque cliente pour IAM, consultez la page Bibliothèques clientes IAM. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM Python.

Pour vous authentifier auprès d'IAM, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

Cloud IAM teste les autorisations du compte de service que vous utilisez pour générer des identifiants.
def test_permissions(project_id: str) -> dict:
    """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

Étapes suivantes

Découvrez comment attribuer, modifier et révoquer les accès des comptes principaux.