使用 IAM 控制对资源的访问权限

本文档介绍了如何查看资源的当前访问权限政策、如何授予资源访问权限以及如何撤消对资源的访问权限

本文档假定您熟悉 Google Cloud 中的 Identity and Access Management (IAM) 系统

所需的角色

如需获取修改资源 IAM 政策所需的权限,请让您的管理员授予您项目的 BigQuery Data Owner (roles/bigquery.dataOwner) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含修改资源 IAM 政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

  • 获取数据集的访问权限政策: bigquery.datasets.get
  • 设置数据集的访问权限政策: bigquery.datasets.update
  • 获取数据集的访问权限政策(仅限 Google Cloud 控制台): bigquery.datasets.getIamPolicy
  • 设置数据集的访问权限政策(仅限控制台): bigquery.datasets.setIamPolicy
  • 获取表或视图的访问权限政策: bigquery.tables.getIamPolicy
  • 设置表或视图的政策: bigquery.tables.setIamPolicy
  • 创建 bq 工具或 SQL BigQuery 作业(可选): bigquery.jobs.create

您也可以使用自定义角色或其他预定义角色来获取这些权限。

查看资源的访问权限政策

以下部分介绍如何查看不同资源的访问权限政策。

查看数据集的访问权限政策

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目,然后选择数据集。

  3. 点击 共享 > 权限

    数据集访问权限政策会显示在数据集权限窗格中。

bq

要获取现有政策并将其输出到 JSON 格式的本地文件,请使用 Cloud Shell 中的 bq show 命令

bq show \
    --format=prettyjson \
    PROJECT_ID:DATASET > PATH_TO_FILE

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • DATASET:您的数据集的名称。
  • PATH_TO_FILE:本地机器上 JSON 文件的路径

API

如需在创建数据集时应用访问权限控制,请使用已定义的 dataset resource 来调用 datasets.insert。要更新访问权限控制,请调用 datasets.patch 并使用 Dataset 资源中的 access 属性。

由于 datasets.update 方法会替换整个数据集资源,因此 datasets.patch 是更新访问权限控制的首选方法。

查看表或视图的访问权限政策

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目并选择表或视图。

  3. 点击 共享

    表或视图访问权限政策将显示在共享窗格中。

bq

要获取现有访问权限政策并将其输出到 JSON 格式的本地文件,请使用 Cloud Shell 中的 bq get-iam-policy 命令

bq get-iam-policy \
    --table=true \
    PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

请替换以下内容:

  • PROJECT_ID:您的项目 ID
  • DATASET:您的数据集的名称。
  • RESOURCE:您要查看其政策的表或视图的名称
  • PATH_TO_FILE:本地机器上 JSON 文件的路径

API

如需检索当前政策,请调用 tables.getIamPolicy 方法

授予对资源的访问权限

以下部分介绍了如何授予对不同资源的访问权限。

授予对数据集的访问权限

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目并选择要共享的数据集。

  3. 点击 共享 > 权限

  4. 点击 添加主帐号

  5. 新的主帐号字段中,输入主帐号。

  6. 选择角色列表中,选择预定义角色或自定义角色。

  7. 点击保存

  8. 要返回数据集信息,请点击关闭

SQL

如需向主帐号授予对数据集的访问权限,请使用 GRANT DCL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    请替换以下内容:

    • ROLE_LIST:您要授予权限的角色或以英文逗号分隔的角色列表
    • RESOURCE_TYPE:角色适用的资源类型

      支持的值包括 SCHEMA(等同于数据集)、TABLEVIEWEXTERNAL TABLE

    • RESOURCE_NAME:您要向其授予权限的资源的名称
    • USER_LIST:为其授予角色的以英文逗号分隔的用户列表。

      如需查看有效格式的列表,请参阅 user_list

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 要将现有数据集信息(包括访问权限控制设置)写入 JSON 文件,请使用 bq show 命令

    bq show \
       --format=prettyjson \
       PROJECT_ID:DATASET > PATH_TO_FILE
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID
    • DATASET:您的数据集的名称。
    • PATH_TO_FILE:本地机器上 JSON 文件的路径
  2. 对 JSON 文件的 access 部分进行更改。您可以将其添加到任何 specialGroup 条目:projectOwnersprojectWritersprojectReadersallAuthenticatedUsers。您还可以添加以下任一项:userByEmailgroupByEmaildomain

    例如,数据集 JSON 文件的 access 部分可能如下所示:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 修改完成后,运行 bq update 命令,并用 --source 标志包括该 JSON 文件。如果数据集不属于默认项目,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET

    bq update \
    --source PATH_TO_FILE \
    PROJECT_ID:DATASET
    
  4. 如需验证您的访问权限控制发生了变化,请再次使用 bq show 命令,但不要将信息写入文件:

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

要在创建数据集时应用访问权限控制,请使用已定义的数据集资源来调用 datasets.insert 方法。要更新访问权限控制,请调用 datasets.patch 方法并使用 Dataset 资源中的 access 属性。

由于 datasets.update 方法会替换整个数据集资源,因此 datasets.patch 是更新访问权限控制的首选方法。

Go

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}
	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       bigquery.ReaderRole,
			EntityType: bigquery.UserEmailEntity,
			Entity:     "sample.bigquery.dev@gmail.com"},
		),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.Acl.User;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import java.util.ArrayList;

public class UpdateDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

    updateDatasetAccess(datasetName, newEntry);
  }

  public static void updateDatasetAccess(String datasetName, Acl newEntry) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Dataset dataset = bigquery.getDataset(datasetName);

      // Get a copy of the ACLs list from the dataset and append the new entry
      ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("Dataset Access Control updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Dataset Access control was not updated \n" + e.toString());
    }
  }
}

Python

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

使用数据集的访问权限控制来设置 dataset.access_entries 属性。然后调用 client.update_dataset() 函数以更新该属性。

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom
# you are adding access. Alternatively, to the JSON REST API representation
# of the entity, such as a view's table reference.
entity_id = "user-or-group-to-add@example.com"

from google.cloud.bigquery.enums import EntityTypes

# TODO(developer): Set entity_type to the type of entity you are granting access to.
# Common types include:
#
# * "userByEmail" -- A single user or service account. For example "fred@example.com"
# * "groupByEmail" -- A group of users. For example "example@googlegroups.com"
# * "view" -- An authorized view. For example
#       {"projectId": "p", "datasetId": "d", "tableId": "v"}
#
# For a complete reference, see the REST API reference documentation:
# https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#Dataset.FIELDS.access
entity_type = EntityTypes.GROUP_BY_EMAIL

# TODO(developer): Set role to a one of the "Basic roles for datasets"
# described here:
# https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
role = "READER"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
entries.append(
    bigquery.AccessEntry(
        role=role,
        entity_type=entity_type,
        entity_id=entity_id,
    )
)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

授予对表或视图的访问权限

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目,然后选择要共享的表或视图。

  3. 点击 共享

  4. 点击 添加主帐号

  5. 新的主帐号字段中,输入主帐号。

  6. 选择角色列表中,选择预定义角色或自定义角色。

  7. 点击保存

  8. 要返回以查看表或视图详细信息,请点击关闭

SQL

如需向主帐号授予对表或视图的访问权限,请使用 GRANT DCL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    请替换以下内容:

    • ROLE_LIST:您要授予权限的角色或以英文逗号分隔的角色列表
    • RESOURCE_TYPE:角色适用的资源类型

      支持的值包括 SCHEMA(等同于数据集)、TABLEVIEWEXTERNAL TABLE

    • RESOURCE_NAME:您要向其授予权限的资源的名称
    • USER_LIST:为其授予角色的以英文逗号分隔的用户列表。

      如需查看有效格式的列表,请参阅 user_list

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 如需将现有表或视图信息(包括访问权限控制设置)写入 JSON 文件,请使用 bq get-iam-policy 命令

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID
    • DATASET:包含要更新的表或视图的数据集的名称
    • TABLE_OR_VIEW:要更新的资源的名称
    • PATH_TO_FILE:本地机器上 JSON 文件的路径
  2. 对 JSON 文件的 access 部分进行更改。您可以将其添加到任何 specialGroup 条目:projectOwnersprojectWritersprojectReadersallAuthenticatedUsers。您还可以添加以下任一项:userByEmailgroupByEmaildomain。 例如,表或视图的 JSON 文件的 access 部分可能如下所示:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 使用 set-iam-policy 命令更新政策:

    bq set-iam-policy \
        PROJECT_ID:DATASET.TABLE_OR_VIEW \
        > PATH_TO_FILE
    

  4. 如需验证您的访问权限控制发生了变化,请再次使用 bq get-iam-policy 命令,但不要将信息写入文件。

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. 如需检索当前政策,请调用 tables.getIamPolicy 方法
  2. 修改政策以添加成员和/或绑定。 如需了解政策所需的格式,请参阅政策参考主题。

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

撤消对资源的访问权限

以下部分介绍如何撤消对不同资源的访问权限。

撤消对数据集的访问权限

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目并选择数据集。

  3. 在详细信息面板中,点击共享 > 权限

  4. 数据集权限对话框中,展开要撤消其访问权限的主帐号。

  5. 点击 移除主帐号

  6. 从主帐号中移除角色?对话框中,点击移除

  7. 要返回数据集详细信息,请点击关闭

SQL

如需移除主帐号对数据集的访问权限,请使用 REVOKE DCL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    请替换以下内容:

    • ROLE_LIST:您要撤消权限的角色或以英文逗号分隔的角色列表
    • RESOURCE_TYPE:从中撤消角色权限的资源类型

      支持的值包括 SCHEMA(等同于数据集)、TABLEVIEWEXTERNAL TABLE

    • RESOURCE_NAME:您要撤消其权限的资源的名称
    • USER_LIST:将撤消其角色的以英文逗号分隔的用户列表

      如需查看有效格式的列表,请参阅 user_list

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 要将现有数据集信息(包括访问权限控制设置)写入 JSON 文件,请使用 bq show 命令

    bq show \
      --format=prettyjson \
      PROJECT_ID:DATASET > PATH_TO_FILE
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID
    • DATASET:您的数据集的名称。
    • PATH_TO_FILE:本地机器上 JSON 文件的路径
  2. 对 JSON 文件的 access 部分进行更改。您可以移除以下任何 specialGroup 条目:projectOwnersprojectWritersprojectReadersallAuthenticatedUsers。您还可以移除以下任何一项:userByEmailgroupByEmaildomain

    例如,数据集 JSON 文件的 access 部分可能如下所示:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 修改完成后,运行 bq update 命令,并用 --source 标志包括该 JSON 文件。如果数据集不属于默认项目,请按以下格式将相应项目 ID 添加到数据集名称中:PROJECT_ID:DATASET

    bq update \
        --source PATH_TO_FILE \
        PROJECT_ID:DATASET
    
  4. 如需验证您的访问权限控制发生了变化,请再次使用 show 命令,但不要将信息写入文件:

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

调用 datasets.patch 并使用 Dataset 资源中的 access 属性更新访问权限控制。

由于 datasets.update 方法会替换整个数据集资源,因此 datasets.patch 是更新访问权限控制的首选方法。

Go

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// revokeDatasetAccess updates the access control on a dataset to remove all
// access entries that reference a specific entity.
func revokeDatasetAccess(projectID, datasetID, entity string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// entity := "user@mydomain.com"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}

	var newAccessList []*bigquery.AccessEntry
	for _, entry := range meta.Access {
		if entry.Entity != entity {
			newAccessList = append(newAccessList, entry)
		}
	}

	// Only proceed with update if something in the access list was removed.
	// Additionally, we use the ETag from the initial metadata to ensure no
	// other changes were made to the access list in the interim.
	if len(newAccessList) < len(meta.Access) {

		update := bigquery.DatasetMetadataToUpdate{
			Access: newAccessList,
		}
		if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
			return err
		}
	}
	return nil
}

Python

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

使用数据集的访问权限控制来设置 dataset.access_entries 属性。然后调用 client.update_dataset() 函数以更新该属性。

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom you are revoking access.
entity_id = "user-or-group-to-remove@example.com"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
dataset.access_entries = [
    entry for entry in entries if entry.entity_id != entity_id
]

dataset = client.update_dataset(
    dataset,
    # Update just the `access_entries` property of the dataset.
    ["access_entries"],
)  # Make an API request.

full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")

撤消对表或视图的访问权限

从下列选项中选择一项:

控制台

  1. 转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目并选择表或视图。

  3. 在详细信息面板中,点击共享

  4. 共享对话框中,展开要撤消其访问权限的主帐号。

  5. 点击 删除

  6. 从主帐号中移除角色?对话框中,点击移除

  7. 要返回以查看表或视图详细信息,请点击关闭

SQL

如需移除主帐号对表或视图的访问权限,请使用 REVOKE DCL 语句

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    请替换以下内容:

    • ROLE_LIST:您要撤消权限的角色或以英文逗号分隔的角色列表
    • RESOURCE_TYPE:从中撤消角色权限的资源类型

      支持的值包括 SCHEMA(等同于数据集)、TABLEVIEWEXTERNAL TABLE

    • RESOURCE_NAME:您要撤消其权限的资源的名称
    • USER_LIST:将撤消其角色的以英文逗号分隔的用户列表

      如需查看有效格式的列表,请参阅 user_list

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

bq

  1. 如需将现有表或视图信息(包括访问权限控制设置)写入 JSON 文件,请使用 bq get-iam-policy 命令

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    请替换以下内容:

    • PROJECT_ID:您的项目 ID
    • DATASET:包含要更新的表或视图的数据集的名称
    • TABLE_OR_VIEW:要更新的资源的名称
    • PATH_TO_FILE:本地机器上 JSON 文件的路径

  2. 对 JSON 文件的 access 部分进行更改。您可以移除以下任何 specialGroup 条目:projectOwnersprojectWritersprojectReadersallAuthenticatedUsers。您还可以移除以下任何一项:userByEmailgroupByEmaildomain。 例如,表或视图的 JSON 文件的 access 部分可能如下所示:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 使用 bq set-iam-policy 命令更新政策:

     bq set-iam-policy \
         PROJECT_ID:DATASET.TABLE_OR_VIEW \
         > PATH_TO_FILE
    

  4. 如需验证您的访问权限控制发生了变化,请再次使用 get-iam-policy 命令,但不要将信息写入文件:

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. 如需检索当前政策,请调用 tables.getIamPolicy 方法
  2. 修改政策以移除成员和/或绑定。如需了解政策所需的格式,请参阅政策参考主题。

  3. 调用 tables.setIamPolicy 以写入更新后的政策。 注意:不允许没有任何成员的空绑定,这样的空绑定将导致错误。

Java

试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}