映射 ACL

为了确保只有有权访问某个项的用户才能在搜索结果中看到该项,请使用企业代码库中的访问控制列表 (ACL) 将项编入索引。您必须为代码库 ACL 建模,并在为项编制索引时包含这些 ACL。内容连接器 SDK 提供了一些方法,可对大多数代码库的 ACL 进行建模。

创建 ACL

创建 ACL 的过程分为两个步骤:

  1. 使用 ACL 类中的静态方法创建 Principal
  2. 使用 Acl.Builder 类构建 ACL。

本文档介绍了为 ACL 建模和创建 ACL 时需要了解的一些概念,例如继承和包含。

使用外部 ID 创建主账号

Google Cloud Search 要求将用户和群组解析为 Google 电子邮件地址。将代码库项编入索引时,内容连接器可能没有这些电子邮件地址。不过,内容连接器 SDK 允许您使用外部 ID(授予用户或群组对代码库项的访问权限的 ID)代替电子邮件地址,以便将项编入索引。使用 getUserPrincipal 方法或 getGroupPrincipal 方法创建包含外部 ID 的主账号。ACL 类包含多个其他用于构建 Principal 对象的静态方法。

重新映射商品的身份后,您必须重新为商品编制索引,新身份才能生效。如需了解详情,请参阅重新映射身份

ACL 继承

ACL 继承是指针对某个特定项和用户的授权,该授权依据的是该项及其继承链的合并 ACL。授权决定的规则取决于代码库和项属性。

设置继承

每个项都可以有直接允许的主账号直接拒绝的主账号,这些主账号可以使用 setReaderssetDeniedReaders 方法指定。“直接允许的主账号”是指在 ACL 中标识为能够直接访问某项的用户。“直接拒绝的主账号”是指在 ACL 中标识为无权访问某项的用户。

商品还可以使用 setInheritFrom 方法继承间接允许的主账号间接拒绝的主账号。间接允许的主账号可通过 ACL 继承间接访问某项内容。间接拒绝的主账号是通过继承来拒绝访问的。

图 1 显示了如何使用 setInheritFrom 方法继承主账号。

展示各个项之间的关联的图片
图 1. setInheritFrom 方法。

图 1 表示了以下访问控制:

  • 用户 1 是项 A 的“直接允许的主账号”。
  • 用户 2 是项 B 的“直接允许的主账号”。
  • 项 B 继承项 A 的 ACL。

根据这些控制,访问规则如下:

  • 用户 1 是项 B 的“间接允许的主账号”,但未明确指定;访问权限是从项 A 继承的。
  • 用户 2 不是项 A 的“间接允许的主账号”。

设置继承类型

如果您使用 setInheritFrom 方法设置继承,则必须使用 setInheritanceType 方法设置继承类型。继承类型确定子项 ACL 与父项 ACL 的合并方式。Acl.InheritanceType 实现了三种类型:

  • BOTH_PERMIT - 只有在子项和父项 ACL 都允许的情况下才授予访问权限。
  • CHILD_OVERRIDE - 如果发生冲突,子级 ACL 的优先级高于父级 ACL。即使父项拒绝用户访问子项,用户也可以访问子项;即使父项允许用户访问子项,用户也可能被拒绝访问子项。
  • PARENT_OVERRIDE - 如果发生冲突,父 ACL 优先于子 ACL。

Cloud Search 按照从叶项到根项的顺序来评估 ACL 继承链。评估从子项及其父项开始,然后可以一直进行到根父项。

例如,如果孩子使用 CHILD_OVERRIDE 且用户拥有访问权限,Cloud Search 无需评估父项。不过,如果子级使用 PARENT_OVERRIDEBOTH_PERMIT,Cloud Search 会继续向上评估链。

删除包含关系和项

在为商品编制索引时,您可以使用 IndexingItemBuilder 类的 setContainer 方法将其标记为容器。此关系用于建立物理层次结构,确保可以妥善删除项。删除容器时,其中包含的项也会被删除。

包含关系独立于 ACL 继承规则。例如,某个文件夹可以包含一个文件以便删除,但该文件可以从其他文件夹继承其 ACL。删除某个文件夹时,系统不会删除继承其 ACL 的项,除非这些项也在该文件夹的包含层次结构中。

图 2 表示了以下访问控制关系:

  • 用户 1 是项 A 的“直接允许的主账号”。
  • 用户 2 是项 B 的“直接允许的主账号”。
  • 用户 3 是项 C 的“直接允许的主账号”。
  • 项 C 继承项 A 的 ACL。
  • 项 B 指定项 A 作为其容器。
  • 项 C 指定项 B 作为其容器。

根据这些控制,访问规则如下:

  • 间接访问是通过使用 setInheritFrom 方法进行的。用户 1 可以访问项 C,因为项 C 继承自项 A。
  • 间接访问不是通过包含关系实现的。用户 2 无法访问项 C。
展示各个项之间的关联的图片
图 2. 所用的 setInheritFrom 方法。

这种将 ACL 继承与包含分离的设计让您能够为许多结构建模。

删除内容后:

  • 包含被删除项的任何项都将无法搜索,并且系统会安排将其删除。
  • setInheritFrom 中指定了被删除项的任何项都将无法搜索。

如果资源针对已删除的项使用 setInheritFrom,但未设置容器或其层次结构不包含已删除的项,则该项会保留在数据源中。您需要负责删除该文件。

图 3 显示了删除操作在项的层次结构中的工作方式。

展示各个项之间的关联的图片
图 3. 删除项和 ACL 继承。

图 3 表示了以下访问控制关系:

  • 用户 1 是项 A 的“直接允许的主账号”。
  • 用户 2 是项 D 的“直接允许的主账号”。
  • 项 D 和项 E 都继承自项 A。
  • 项 D 指定项 A 作为其容器。
  • 项 A 和项 E 是根级项。

删除操作通过容器引用进行级联。删除项目 A 后:

  • 所有用户都无法访问 setInheritFrom 引用的所有后代。
  • 用户无法再访问项 A。
  • 系统会隐式删除项 D,使其无法访问。
  • 系统不会删除项 E,但会使其无法访问和搜索。