Tester les autorisations

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, Cloud Console 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 Cloud Console masque ou affiche les éléments en conséquence.

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 membre.

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

  • project-id : ID de votre projet Google Cloud.

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#

Avant d'essayer cet exemple, suivez les instructions de configuration pour C# décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage C#.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Java.

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

Avant d'essayer cet exemple, suivez les instructions de configuration pour Python décrites dans le Guide de démarrage rapide de Cloud IAM – Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API Cloud IAM en langage Python.

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

Étapes suivantes

Découvrez comment attribuer, modifier et révoquer les accès des membres d'un projet.