권한 테스트

대부분의 Google Cloud 리소스에서는 testIamPermissions() 메서드가 공개되어 있으므로 현재 인증된 호출자에게 리소스에 대해 하나 이상의 특정 IAM 권한이 부여되었는지 여부를 프로그래매틱 방식으로 확인할 수 있습니다. testIamPermissions() 메서드는 리소스 식별자와 권한 집합을 입력 매개변수로 취하고 호출자에게 허용된 권한 집합을 반환합니다.

testIamPermissions() 메서드를 사용하여 사용자가 웹 애플리케이션에서 관리 도구에 대한 액세스 권한을 가져야 하는지 여부를 결정할 수 있습니다. 예를 들어 이 메서드를 사용하여 사용자의 권한에 따라 Google Cloud 리소스에 대한 자세한 정보를 표시할지 여부를 결정할 수 있습니다.

예를 들어 현재 인증된 사용자에게 프로젝트 삭제 권한이 있는지 확인하려면 프로젝트 ID(예: foo-project) 및 resourcemanager.projects.delete 권한을 입력 매개변수로 제공하여 projects.testIamPermissions() 메서드를 호출하면 됩니다. 호출자에게 resourcemanager.projects.delete 권한이 부여되었다면 응답 본문에 나열될 것입니다. 호출자에게 이 권한이 없다면 응답 본문에 아무 권한도 표시되지 않을 것입니다.

testIamPermissions() 메서드는 인증된 사용자가 볼 권한이 있는지 여부에 근거하여 Google Cloud 리소스를 표시해야 하는 타사 그래픽 사용자 인터페이스(GUI)를 염두에 두고 만든 것입니다. 예를 들어 Cloud Console은 내부적으로 testIamPermissions() 메서드를 사용하여 인증 후 볼 수 있는 리소스와 기능을 결정합니다. 일반적으로 사용자에 따라 다른 권한이 부여되므로 그에 맞게 Cloud Console은 항목을 숨기거나 공개합니다.

권한 테스트 방법

이 예시는 Google Cloud 프로젝트에 대한 resourcemanager.projects.getresourcemanager.projects.delete 권한을 테스트하는 방법을 보여줍니다. 다른 Google Cloud 리소스의 권한을 테스트하려면 각 리소스가 노출한 testIamPermissions() 메서드를 사용합니다. 예를 들어 Cloud Storage 버킷에 대한 IAM 권한을 테스트할 수 있습니다.

REST

이 예시에서 사용자는 프로젝트에 대한 정보를 가져올 수 있지만 프로젝트를 삭제할 수는 없는 IAM 역할을 갖고 있습니다.

Resource Manager API의 projects.testIamPermissions 메서드는 권한 목록을 받아 구성원이 보유한 권한을 테스트합니다.

아래의 요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • project-id: Google Cloud 프로젝트 ID

HTTP 메서드 및 URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:testIamPermissions

JSON 요청 본문:

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

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

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

C#

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 C# 설정 안내를 따르세요. 자세한 내용은 IAM C# API 참조 문서를 확인하세요.

IAM은 사용자 인증 정보를 생성하는 데 사용하는 서비스 계정의 권한을 테스트합니다.

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;
    }
}

자바

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 자바 설정 안내를 따르세요. 자세한 내용은 IAM 자바 API 참조 문서를 확인하세요.

IAM은 사용자 인증 정보를 생성하는 데 사용하는 서비스 계정의 권한을 테스트합니다.
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

이 샘플을 사용해 보기 전에 IAM 빠른 시작: 클라이언트 라이브러리 사용의 Python 설정 안내를 따르세요. 자세한 내용은 IAM Python API 참조 문서를 확인하세요.

IAM은 사용자 인증 정보를 생성하는 데 사용하는 서비스 계정의 권한을 테스트합니다.
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

다음 단계

프로젝트 구성원에게 액세스 권한을 부여하고 변경하고 취소하는 방법 알아보기