控制数据集访问权限

本文档介绍了如何在 BigQuery 中控制对数据集的访问权限。

您可以通过调用 datasets.insert API 方法在数据集创建期间应用访问权限控制。

使用 GCP Console、传统版 BigQuery 网页界面或命令行工具创建数据集期间,您无法应用访问权限控制。

您可以在创建数据集之后通过以下方式对数据集的应用访问权限控制:

  • 使用经典版 BigQuery 网页界面

    • 目前,您无法使用 GCP Console 分配访问权限控制。
  • 使用 bq update CLI 命令

  • 调用 datasets.patch API 方法

概览

您可以使用项目级层角色和数据集级层访问权限控制,共享对 BigQuery 表和视图的访问权限。目前不支持直接向表或视图应用访问权限控制。

项目级层访问权限控制决定了允许访问一个项目内的全部数据集、表、视图和表数据的用户、组和服务帐号。数据集级层访问权限控制决定了允许访问特定数据集内的表、视图和表数据的用户、组和服务帐号。

例如,如果您在项目级层为某个用户分配了 bigquery.dataOwner 角色,则该用户可以在项目的所有数据集内创建、更新和删除表和视图。如果您在数据集级层为某个用户分配了 OWNER 角色,则该用户只能在数据集中创建、更新和删除表和视图。数据集级层 OWNER 初始角色相当于授予了数据集 bigquery.dataOwner 角色。

如果您在项目级层为用户或组分配了更为受限的角色,则必须授予对个别数据集的访问权限。例如,如果您为用户或组授予了项目级层的 bigquery.user 角色,则用户可以创建数据集,并可针对这些数据集中的表运行查询作业。要查询并非由用户创建的数据集中的表,您必须至少为该用户分配其需要查询的各数据集的数据集级层的 READER 访问权限。数据集级 READER 原初角色相当于授予了数据集的 bigquery.dataViewer 角色。

如需详细了解预定义的项目级 IAM 角色和数据集级访问权限控制,请参阅访问权限控制

所需权限

要分配或更新数据集访问权限控制,您必须具有数据集级的 OWNER 访问权限,或者必须分配有包含 bigquery.datasets.update 权限的项目级 IAM 角色。以下预定义的项目级 IAM 角色具有 bigquery.datasets.update 权限:

此外,由于 bigquery.user 角色具有 bigquery.datasets.create 权限,因此被指定为 bigquery.user 角色的用户可以更新该用户创建的任何数据集。在被指定为 bigquery.user 角色的用户创建数据集后,系统将为该用户授予对该数据集的 OWNER 访问权限。 凭借对数据集的 OWNER 访问权限,用户可以完全掌控该数据集。

要详细了解 BigQuery 中的 IAM 角色和权限,请参阅访问权限控制。要详细了解数据集级层角色,请参阅数据集的初始角色

控制对数据集的访问权限

向数据集分配访问权限控制的方法如下:

Console

  1. 资源中选择一个数据集,然后点击窗口右侧附近的共享数据集

    向数据集添加人员

  2. 共享数据集面板的数据集权限标签页中,点击添加成员

  3. “添加成员”面板中,在新成员文本框中输入要添加的用户或群组的电子邮件地址。

  4. 对于选择角色,请选择 BigQuery 并为新成员选择适当的预定义 IAM 角色。如需详细了解分配给每个预定义 BigQuery 角色的权限,请参阅访问控制页面的角色部分。

  5. 点击保存,然后点击完成

传统版界面

  1. 点击数据集右侧的下拉箭头并选择 Share Dataset

  2. Share Dataset 对话框中,对于 Add People,点击该字段左侧的下拉列表,然后选择适当的选项。当您使用传统版网页界面对数据集应用访问权限控制时,您可以向以下用户和群组授予访问权限:

    • 用户(使用电子邮件)(User by e-mail) - 向某个 Google 帐号授予对数据集的访问权限
    • 群组(使用电子邮件)(Group by e-mail) - 向 Google 群组的所有成员授予对数据集的访问权限
    • 网域 - 向某个 Google 网域中的所有用户和群组授予对数据集的访问权限
    • 所有经过身份验证的用户 (All Authenticated Users) - 向所有 Google 帐号拥有者授予对数据集的访问权限(将数据集设为公开)
    • 项目所有者 (Project Owners) - 向所有项目所有者授予对数据集的访问权限
    • 项目查看者 (Project Viewers) - 向所有项目查看者授予对数据集的访问权限
    • 项目编辑者 (Project Editors) - 向所有项目编辑者授予对数据集的访问权限
    • 已获授权的视图 (Authorized View) - 向视图授予对数据集的访问权限

  3. 在文本框中输入一个值。例如,如果选择用户(使用电子邮件)(User by e-mail) 或群组(使用电子邮件)(Group by e-mail),请输入相应用户或群组的电子邮件地址。

  4. 添加人员字段右侧,点击可以查看并从列表中选择适当的角色。

    向数据集添加人员

  5. 点击添加,然后点击保存更改

命令行

  1. 使用 show 命令将现有数据集信息(包括访问权限控制)写入 JSON 文件。如果数据集不属于默认项目,请按以下格式将相应项目 ID 添加到数据集名称中:[PROJECT_ID]:[DATASET]

    bq show --format=prettyjson [PROJECT_ID]:[DATASET] > [PATH_TO_FILE]
    

    其中:

    • [PROJECT_ID] 是您的项目 ID。
    • [DATASET] 是数据集的名称。
    • [PATH_TO_FILE] 是本地计算机上 JSON 文件的路径。

      示例:

      输入以下命令可将 mydataset 的访问权限控制写入 JSON 文件。mydataset 属于默认项目。

      bq show --format=prettyjson mydataset > /tmp/mydataset.json

      输入以下命令可将 mydataset 的访问权限控制写入 JSON 文件。mydataset 属于 myotherproject

      bq show --format=prettyjson myotherproject:mydataset > /tmp/mydataset.json

  2. 对 JSON 文件的 "access" 部分进行更改。您可以添加或移除任意 specialGroup 条目:projectOwnersprojectWritersprojectReadersallAuthenticatedUsers。还可以添加、移除或修改以下任一项:userByEmailgroupByEmaildomain

    例如,某个数据集的 JSON 文件的“访问权限”部分可能如下所示:

    {
     "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. 修改完成后,使用 update 命令并使用 --source 标志包含 JSON 文件。如果数据集不属于默认项目,请按以下格式将相应项目 ID 添加到数据集名称中:[PROJECT_ID]:[DATASET]

    bq update --source [PATH_TO_FILE] [PROJECT_ID]:[DATASET]
    

    其中:

    • [PATH_TO_FILE] 是本地计算机上 JSON 文件的路径。
    • [PROJECT_ID] 是您的项目 ID。
    • [DATASET] 是数据集的名称。

      示例:

      输入以下命令可更新 mydataset 的访问权限控制。mydataset 属于默认项目。

      bq update --source /tmp/mydataset.json mydataset

      输入以下命令可更新 mydataset 的访问权限控制。mydataset 属于 myotherproject

      bq update --source /tmp/mydataset.json myotherproject:mydataset

  4. 要验证访问权限控制的更改,请再次输入 show 命令,但不要将信息写入文件。

    bq show --format=prettyjson [DATASET]

    bq show --format=prettyjson [PROJECT_ID]:[DATASET]

API

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

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

如需了解详情,请参阅数据集

Go

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

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
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
}

Python

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

使用数据集的访问权限控制设置 dataset.access_entries 属性,然后调用 client.update_dataset() 函数来更新属性。
from google.cloud import bigquery

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

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

dataset = client.get_dataset(dataset_id)

entry = bigquery.AccessEntry(
    role="READER",
    entity_type="userByEmail",
    entity_id="sample.bigquery.dev@gmail.com",
)

entries = list(dataset.access_entries)
entries.append(entry)
dataset.access_entries = entries

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

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

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
需要帮助?请访问我们的支持页面