创建和管理已获授权的视图

本文档介绍了如何使用 Google Cloud CLI 或 Google Cloud 控制台定义、创建已获授权的视图并对其执行其他管理操作。在阅读本文档之前,您应先熟悉已获授权的视图概览

所需的角色

如需获得对已获授权视图执行管理操作所需的权限,请让您的管理员为您授予底层表的 Bigtable Admin (roles/bigtable.admin) IAM 角色。 如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

此预定义角色可提供对已获授权的视图执行管理操作所需的权限。如需查看所需的确切权限,请展开所需权限部分:

所需权限

如需对已获授权的视图执行管理操作,您需要具备以下权限:

  • bigtable.authorizedViews.get
  • bigtable.authorizedViews.list
  • bigtable.authorizedViews.create
  • bigtable.authorizedViews.update
  • bigtable.authorizedViews.delete
  • bigtable.authorizedViews.getIamPolicy
  • bigtable.authorizedViews.setIamPolicy
  • bigtable.authorizedViews.readRows
  • bigtable.authorizedViews.sampleRowKeys
  • bigtable.authorizedViews.mutateRows

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

如需了解如何在已获授权视图级层管理 Bigtable IAM 角色,请参阅已获授权视图级 IAM 管理

创建授权视图

创建已获授权的视图时,请考虑将针对该视图运行的查询。发送到已获授权的视图的读取、写入和删除请求只能引用已获授权的视图中的数据。例如,这意味着,如果您尝试读取、写入或删除表中包含您未获授权访问的列的行,请求将会失败。

为避免向已获授权视图发出的数据请求因表中添加了未包含在已获授权视图中的列而失败,您可以为列族指定空列限定符前缀“”。

每个已获授权的视图最多可以指定 100 个定义参数。

控制台

  1. 在 Google Cloud 控制台中打开 Bigtable 实例列表。

    打开实例列表

  2. 点击包含您要获得授权查看的表的实例。

  3. 在导航窗格中,点击 Bigtable Studio

  4. 点击构建器以打开查询构建器。

  5. 选择您要授权查看的表。

  6. 添加子句以构建一个查询,该查询仅返回您希望已获授权的视图用户有权访问的数据。

    • 授权视图可接受的子句包括行键前缀(列限定符)。
    • 如需指定列限定符前缀,请在前缀后面添加星号。例如,如需包含以“data”开头的所有列,请在列族名称后面的“Columns”(列)字段中输入 data*
    • 保存已获授权的视图时,系统会忽略 Limit 子句。
    • 如需详细了解如何使用查询构建器,请参阅在控制台中构建查询
  7. 点击运行

  8. 验证结果窗格中显示的数据应包含在已获授权的视图中后,点击另存为视图

  9. 为授权视图输入一个尚未用于表的永久标识符。

  10. 可选:如需保存但不授予访问权限,请点击保存

  11. 可选:如需保存授权视图,然后为其配置访问权限,请点击保存并授予访问权限。如需详细了解访问权限控制,请参阅使用 IAM 进行 Bigtable 访问权限控制

    1. 添加至少一个主账号,然后选择应为该主账号或主账号组分配的角色。
    2. 可选:如需为其他角色授予访问权限,请点击添加其他角色,然后输入每个其他角色的主账号和角色。
    3. 点击保存

gcloud

运行 bigtable authorized-views create 命令。如需了解详情,请参阅 gcloud bigtable authorized-views create 中的参考文档。

gcloud bigtable authorized-views create AUTHORIZED_VIEW_ID \
  --instance=INSTANCE_ID \
  --table=TABLE_ID \
  --definition-file=DEFINITION_FILE_PATH

替换以下内容:

  • AUTHORIZED_VIEW_ID:已获授权的视图的永久标识符(该视图尚未用于该表)
  • INSTANCE_ID:包含该表的实例的永久标识符
  • TABLE_ID:您要为其创建已获授权视图的表的永久标识符
  • DEFINITION_FILE_PATH:已获授权视图的有效 JSON 格式表示的路径。如需查看格式正确的定义文件示例,请参阅定义文件示例

您也可以在不提供定义文件的情况下运行该命令。在这种情况下,gcloud CLI 会打开一个编辑器,并提示您输入值。

如需确认已创建授权视图,请为表获取授权视图列表

Java

如需了解如何安装和使用 Bigtable 的客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

try {
  CreateAuthorizedViewRequest request =
      CreateAuthorizedViewRequest.of(tableId, authorizedViewId)
          .setAuthorizedViewType(
              SubsetView.create()
                  .addRowPrefix("")
                  .setFamilySubsets(
                      COLUMN_FAMILY,
                      FamilySubsets.create().addQualifierPrefix(COLUMN_QUALIFIER_NAME)));
  AuthorizedView authorizedView = adminClient.createAuthorizedView(request);
  System.out.printf("AuthorizedView: %s created successfully%n", authorizedView.getId());
} catch (NotFoundException e) {
  System.err.println(
      "Failed to create an authorized view from a non-existent table: " + e.getMessage());
}

修改已获授权的视图

控制台

  1. 在 Google Cloud 控制台中打开 Bigtable 实例列表。

    打开实例列表

  2. 点击包含已获授权的视图的实例。

  3. 在导航窗格中,点击 Bigtable Studio

  4. 在浏览器中,展开相应表和已获授权的视图

  5. 在要修改的已获授权视图旁边,点击 more_vert 操作菜单,然后点击打开

  6. 修改或添加子句以构建查询,使其仅返回您希望授权视图用户有权访问的数据。

    • 授权视图可接受的子句包括行键前缀(列限定符)。
    • 如需指定列限定符前缀,请在前缀后面添加星号。例如,如需包含以“data”开头的所有列,请在列族名称后面的“Columns”(列)字段中输入 data*
    • 保存已获授权的视图时,系统会忽略 Limit 子句。
    • 如需详细了解如何使用查询构建器,请参阅在控制台中构建查询
  7. 点击运行

  8. 验证结果窗格中显示的数据应包含在已获授权的视图中后,点击另存为视图

  9. 在对话框中,输入您修改的已获授权视图的 ID。

    该对话框会显示一条消息,警告您正在覆盖现有的已获授权视图。

  10. 可选:如需保存但不授予访问权限,请点击保存

  11. 可选:如需保存授权视图,然后为其配置访问权限,请点击保存并授予访问权限。如需详细了解访问权限控制,请参阅使用 IAM 进行 Bigtable 访问权限控制

    1. 添加至少一个主账号,然后选择应为该主账号或主账号组分配的角色。
    2. 可选:如需为其他角色授予访问权限,请点击添加其他角色,然后输入每个其他角色的主账号和角色。
    3. 点击保存

gcloud

使用 bigtable authorized-views update 命令修改已获授权的视图。如需了解详情,请参阅 gcloud bigtable authorized-views update 中的参考文档。

gcloud bigtable authorized-views update AUTHORIZED_VIEW_ID \
  --instance=INSTANCE_ID \
  --table=TABLE_ID \
  --definition-file=DEFINITION_FILE_PATH

替换以下内容:

  • AUTHORIZED_VIEW_ID:已获授权视图的永久标识符
  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:源表的永久标识符
  • DEFINITION_FILE_PATH:已获授权视图的有效 JSON 格式表示的路径。如需查看格式正确的定义文件示例,请参阅定义文件示例

您也可以在不提供定义文件的情况下运行该命令。在这种情况下,gcloud CLI 会打开一个编辑器,并提示您输入值。

可选:如需阻止 gcloud CLI 显示确认提示,显示当前已获授权的视图结构与更新提交后之间的差异,请将 --no-interactive 标志附加到该命令。

Java

如需了解如何安装和使用 Bigtable 的客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

try {
  // Update to an authorized view permitting everything.
  UpdateAuthorizedViewRequest request =
      UpdateAuthorizedViewRequest.of(tableId, authorizedViewId)
          .setAuthorizedViewType(
              SubsetView.create()
                  .addRowPrefix("")
                  .setFamilySubsets(
                      COLUMN_FAMILY, FamilySubsets.create().addQualifierPrefix("")));
  AuthorizedView authorizedView = adminClient.updateAuthorizedView(request);
  System.out.printf("AuthorizedView: %s updated successfully%n", authorizedView.getId());
} catch (NotFoundException e) {
  System.err.println("Failed to modify a non-existent authorized view: " + e.getMessage());
}

启用或停用删除防护

如需为已获授权的视图启用删除保护,请将 --deletion-protection 添加到更新命令中。

如需停用删除保护,请将 no-deletion-protection 添加到更新命令中。

删除已获授权的视图

如果您删除某个表,该表的所有已获授权的视图也会一并删除。

已获授权的视图一经删除,便无法恢复。不过,如果您删除表,然后取消删除该表,则该表的所有已获授权的视图也会随表一起恢复。然后,您必须为授权视图和表重新配置 IAM。如需了解详情,请参阅取消删除表

控制台

  1. 在 Google Cloud 控制台中打开 Bigtable 实例列表。

    打开实例列表

  2. 点击包含已获授权的视图的实例。

  3. 在导航窗格中,点击 Bigtable Studio

  4. 在浏览器中,展开相应表和已获授权的视图

  5. 在要删除的已获授权视图旁边,点击 more_vert 操作菜单,然后点击删除

gcloud

使用 bigtable instances tables authorized-views delete 命令删除已获授权的视图。如需了解详情,请参阅 gcloud bigtable authorized-views delete 中的参考文档。

gcloud bigtable authorized-views delete AUTHORIZED_VIEW_ID \
  --instance=INSTANCE_ID \
  --table=TABLE_ID

替换以下内容:

  • AUTHORIZED_VIEW_ID:已获授权视图的永久标识符
  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:源表的永久标识符

可选:如需阻止 gcloud CLI 显示要求您确认或取消删除的确认提示,请将 --nointeractive 标志附加到该命令。

Java

如需了解如何安装和使用 Bigtable 的客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

try {
  adminClient.deleteAuthorizedView(tableId, authorizedViewId);
  System.out.printf("AuthorizedView: %s deleted successfully%n", authorizedViewId);
} catch (NotFoundException e) {
  System.err.println("Failed to delete a non-existent authorized view: " + e.getMessage());
}

获取表的已获授权视图列表

控制台

  1. 在 Google Cloud 控制台中打开 Bigtable 实例列表。

    打开实例列表

  2. 点击包含已获授权的视图的实例。

  3. 在导航窗格中,点击 Bigtable Studio

  4. 在浏览器中,展开相应表和已获授权的视图

gcloud

运行 bigtable authorized-views list 命令。如需了解详情,请参阅 gcloud bigtable authorized-views list 中的参考文档。

gcloud bigtable authorized-views list \
  --instance=INSTANCE_ID \
  --table=TABLE_ID

替换以下内容:

  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:表的永久标识符

Java

如需了解如何安装和使用 Bigtable 的客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

List<String> authorizedViewIds = new ArrayList<>();
try {
  authorizedViewIds = adminClient.listAuthorizedViews(tableId);
  for (String authorizedViewId : authorizedViewIds) {
    System.out.println(authorizedViewId);
  }
} catch (NotFoundException e) {
  System.err.println(
      "Failed to list authorized views from a non-existent table: " + e.getMessage());
}

查看已获授权的视图的详细信息

控制台

  1. 在 Google Cloud 控制台中打开 Bigtable 实例列表。

    打开实例列表

  2. 点击包含已获授权的视图的实例。

  3. 在导航窗格中,点击 Bigtable Studio

  4. 在浏览器中,展开相应表和已获授权的视图

  5. 在您要查看的已获授权视图旁边,点击 more_vert 操作菜单,然后点击打开

gcloud

如需获取有关已获授权视图的详细信息,请运行 bigtable instances tables authorized-views describe 命令。如需了解详情,请参阅 gcloud bigtable authorized-views describe 中的参考文档。

gcloud bigtable authorized-views describe \
–-instance=INSTANCE_ID \
–-table=TABLE_ID \
AUTHORIZED_VIEW_ID

替换以下内容:

  • INSTANCE_ID:实例的永久性标识符
  • TABLE_ID:表的永久标识符
  • AUTHORIZED_VIEW_ID:已获授权视图的永久标识符

Java

如需了解如何安装和使用 Bigtable 的客户端库,请参阅 Bigtable 客户端库

如需向 Bigtable 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为客户端库设置身份验证

AuthorizedView authorizedView = null;
try {
  authorizedView = adminClient.getAuthorizedView(tableId, authorizedViewId);
  SubsetView subsetView = (SubsetView) authorizedView.getAuthorizedViewType();

  for (ByteString rowPrefix : subsetView.getRowPrefixes()) {
    System.out.printf("Row Prefix: %s%n", rowPrefix.toStringUtf8());
  }
  for (Map.Entry<String, FamilySubsets> entry : subsetView.getFamilySubsets().entrySet()) {
    for (ByteString qualifierPrefix : entry.getValue().getQualifierPrefixes()) {
      System.out.printf(
          "Column Family: %s, Qualifier Prefix: %s%n",
          entry.getKey(), qualifierPrefix.toStringUtf8());
    }
    for (ByteString qualifier : entry.getValue().getQualifiers()) {
      System.out.printf(
          "Column Family: %s, Qualifier: %s%n", entry.getKey(), qualifier.toStringUtf8());
    }
  }
} catch (NotFoundException e) {
  System.err.println(
      "Failed to retrieve metadata from a non-existent authorized view: " + e.getMessage());
}

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

如需详细了解访问权限控制,请参阅使用 IAM 进行 Bigtable 访问权限控制

控制台

  1. 在 Google Cloud 控制台中打开 Bigtable 实例列表。

    打开实例列表

  2. 点击包含已获授权的视图的实例。

  3. 在导航窗格中,点击 Bigtable Studio

  4. 在“探索器”窗格中,展开相应表和已获授权的视图

  5. 点击已获授权的视图名称旁边的 more_vert 操作菜单,然后点击授予访问权限

  6. 添加至少一个主账号,然后选择应为该主账号或主账号组分配的角色。

  7. 可选:如需为其他角色授予访问权限,请点击添加其他角色,然后输入每个其他角色的主账号和角色。

  8. 点击保存

gcloud

如需授予对已获授权视图的访问权限,请使用 bigtable authorized-views add-iam-policy-binding 命令。如需了解详情,请参阅 gcloud bigtable authorized-views add-iam-policy-binding 参考文档。

gcloud bigtable authorized-views add-iam-policy-binding AUTH_VIEW_ID \
--instance=INSTANCE_ID --table=TABLE_ID \
--member=PRINCIPAL --role=ROLE

替换以下内容:

  • AUTH_VIEW_ID:已获授权的视图的 ID
  • TABLE_ID:授权视图所属的表的 ID
  • INSTANCE_ID:包含该表的实例
  • PRINCIPAL:您要授予访问权限的主账号(用户),例如 user:222larabrown@gmail.com
  • ROLE:您要授予的角色,例如 roles/bigtable.viewer

后续步骤