הרשאות בדיקה לממשקי משתמש בהתאמה אישית

רוב המשאבים Google Cloud חושפים את ה-method‏ testIamPermissions(), שמאפשרת לבדוק באופן פרוגרמטי אם למשתמש המאומת יש הרשאות ספציפיות למשאב ב-IAM. ה-method ‏testIamPermissions() מקבלת מזהה משאב וסדרת הרשאות כפרמטרים של קלט, ומחזירה את סדרת ההרשאות שיש למשתמש ששלח את הקריאה.

תוכלו להשתמש ב-testIamPermissions() כדי להחליט אם למשתמש צריכה להיות גישה לכלי אדמין באפליקציית אינטרנט. לדוגמה, אפשר להשתמש בשיטה הזו כדי להחליט, על סמך ההרשאות של המשתמש, האם להציג מידע מפורט על משאב Google Cloud .

לדוגמה, כדי לקבוע אם למשתמש המאומת יש הרשאה למחוק פרויקט, קוראים ל-method ‏projects.testIamPermissions() עם מזהה הפרויקט (למשל foo-project) וההרשאה resourcemanager.projects.delete כפרמטרים של הקלט. אם למשתמש ששלח את הקריאה יש את ההרשאה resourcemanager.projects.delete, היא תופיע בגוף התשובה. אם אין לו את ההרשאה הזו, בגוף התשובה לא תופיע אף הרשאה.

ה-method ‏testIamPermissions() מיועדת לממשקי משתמש גרפיים (GUI) של צד שלישי, שצריכים להציג משאבים Google Cloud בהתאם להרשאות שיש למשתמש המאומת לראות. לדוגמה, במסוףGoogle Cloud משתמשים ב-method ‏testIamPermissions() כדי לקבוע אילו משאבים ופונקציות יהיו גלויים אחרי האימות. בדרך כלל למשתמשים שונים יש הרשאות שונות, והפריטים מוצגים או מוסתרים במסוף Google Cloud בהתאם להרשאות.

לפני שמתחילים

התפקידים הנדרשים

לא צריך אף תפקיד ב-IAM כדי לבדוק את ההרשאות.

איך בודקים הרשאות

בדוגמה הזו תוכלו לראות איך בודקים את ההרשאות resourcemanager.projects.get ו-resourcemanager.projects.delete בGoogle Cloud פרויקט. כדי לבדוק את ההרשאות במשאבים אחרים Google Cloud , משתמשים ב-method ‏testIamPermissions() שכל אחד מהמשאבים חושף. לדוגמה, תוכלו לבדוק את ההרשאות ב-IAM לקטגוריה של Cloud Storage.

C++

במאמר ספריות הלקוח של IAM מוסבר איך להתקין את ספריית הלקוח ולהשתמש בה ב-IAM. למידע נוסף, קראו את מאמרי העזרה של ‎IAM C++ API‎.

כדי לבצע אימות ב-IAM, צריך להגדיר את Application Default Credentials. מידע נוסף מופיע במאמר לפני שמתחילים.

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#

כדי לבצע אימות למנהל המשאבים, מגדירים את ה-Application Default Credentials מידע נוסף מופיע במאמר לפני שמתחילים.

מידע על התקנת ספריית הלקוח למנהל המשאבים והשימוש בה מופיע במאמר ספריות הלקוח של מנהל המשאבים.

ההרשאות של חשבון השירות שבו נוצרו פרטי הכניסה נבדקות ב-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;
    }
}

Java

כדי לבצע אימות למנהל המשאבים, מגדירים את ה-Application Default Credentials מידע נוסף מופיע במאמר לפני שמתחילים.

מידע על התקנת ספריית הלקוח למנהל המשאבים והשימוש בה מופיע במאמר ספריות הלקוח של מנהל המשאבים.

ההרשאות של חשבון השירות שבו נוצרו פרטי הכניסה נבדקות ב-IAM.

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

כדי לבצע אימות למנהל המשאבים, מגדירים את ה-Application Default Credentials מידע נוסף מופיע במאמר לפני שמתחילים.

מידע על התקנת ספריית הלקוח למנהל המשאבים והשימוש בה מופיע במאמר ספריות הלקוח של מנהל המשאבים.

ההרשאות של חשבון השירות שבו נוצרו פרטי הכניסה נבדקות ב-IAM.

def test_permissions(project_id: str) -> List[str]:
    """Tests IAM permissions of currently authenticated user to a project."""

    projects_client = resourcemanager_v3.ProjectsClient()
    if not project_id.startswith("projects/"):
        project_id = "projects/" + project_id

    owned_permissions = projects_client.test_iam_permissions(
        resource=project_id,
        permissions=["resourcemanager.projects.get", "resourcemanager.projects.delete"],
    ).permissions

    print("Currently authenticated user has following permissions:", owned_permissions)
    return owned_permissions

REST

בדוגמה הזו, למשתמש יש ב-IAM תפקיד שמאפשר לו לקבל מידע על הפרויקט, אבל לא למחוק פרויקטים.

ה-method ‏projects.testIamPermissions ב-Resource Manager API מקבלת רשימת הרשאות ובודקת אילו הרשאות יש לחשבון המשתמש.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.

ה-method של ה-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"
  ]
}

המאמרים הבאים

איך נותנים, משנים ומבטלים גישה לחשבונות משתמשים