为了确保只有有权访问某个项的用户才能在搜索结果中看到该项,请使用企业代码库中的访问控制列表 (ACL) 将项编入索引。您必须为代码库 ACL 建模,并在将项编入索引时包含这些 ACL。内容连接器 SDK 提供了一些方法,可用于为大多数代码库的 ACL 建模。
创建 ACL
创建 ACL 的过程分为两步:
- 使用
PrincipalACL ACL 类中的静态方法创建。 - 使用
Acl.Builder类构建 ACL。
本文档介绍了为 ACL 建模和创建 ACL 时需要了解的概念,例如继承和包含。
使用外部 ID 创建主账号
Google Cloud Search 要求用户和群组解析为 Google 电子邮件地址。在将代码库项编入索引时,内容连接器可能没有这些电子邮件地址。不过,内容连接器 SDK 允许您使用
外部 ID(授予用户或群组对代码库项的访问权限的 ID)代替电子邮件地址,以便将项编入索引。使用
getUserPrincipal
方法或
getGroupPrincipal
方法创建包含外部 ID 的主账号。
ACL
类包含多个其他静态方法,可用于构建 Principal 对象。
重新映射项的身份后,您必须重新将项编入索引,新身份才会生效。如需了解详情,请参阅 重新映射身份。
ACL 继承
ACL 继承是指针对特定项和用户的授权,该授权依据的是该项的 ACL 及其继承链的 ACL 的合并结果。 授权决策的规则取决于代码库和项属性。
设置继承
每个项都可以有直接允许的正文和直接拒绝的正文,
它们是使用
setReaders
和
setDeniedReaders
方法指定的。“直接允许的正文”是指在 ACL 中标识为能够直接访问项的用户。“直接拒绝的正文”是指在 ACL 中标识为无权访问项的用户。
项还可以使用方法继承间接允许的正文和间接拒绝的
正文。setInheritFrom“间接允许的主账号”是指能够通过 ACL 继承来间接访问项的用户。“间接拒绝的主账号”是指被拒绝通过继承来访问项的用户。
图 1 显示了如何使用
setInheritFrom
方法继承主账号。
setInheritFrom
方法。图 1 表示以下访问权限控制:
- 用户 1 是项 A 的“直接允许的正文”。
- 用户 2 是项 B 的“直接允许的主账号”。
- 项 B 继承项 A 的 ACL。
根据这些控制,访问规则如下:
- 用户 1 是项 B 的间接允许的正文,无需明确指定;访问权限是从项 A 继承的。
- 用户 2 不是项 A 的“间接允许的主账号”。
设置继承类型
如果您使用
setInheritFrom
方法设置继承,还必须使用
setInheritanceType
方法设置继承类型。继承类型决定了子 ACL 如何与父 ACL 合并。
Acl.InheritanceType
实现了以下三种类型:
BOTH_PERMIT- 仅当子 ACL 和父 ACL 都允许 时才授予访问权限。CHILD_OVERRIDE- 如果发生冲突,子 ACL 优先于父 ACL。即使父 ACL 拒绝访问,用户也可以访问子 ACL;即使父 ACL 允许访问,用户也可能被拒绝访问子 ACL。PARENT_OVERRIDE- 如果发生冲突,父 ACL 优先于子 ACL。
Cloud Search 按照从叶项到根项的顺序来评估 ACL 继承链。 评估从子项及其父项开始,可以一直进行到根父项。
例如,如果子项使用 CHILD_OVERRIDE 且用户具有访问权限,则 Cloud Search 无需评估父项。但是,如果子项使用
PARENT_OVERRIDE 或 BOTH_PERMIT,Cloud Search 会继续向上评估链。
删除包含关系和项
在将项编入索引时,您可以使用
setContainer
方法将其标记为容器。IndexingItemBuilder此关系用于建立物理层次结构,确保可以妥善删除项。当容器被删除时,它所包含的项也会被删除。
包含关系独立于 ACL 继承规则。例如,文件夹可以包含文件以供删除,但文件可以从其他文件夹继承其 ACL。删除某个文件夹时,系统不会删除继承其 ACL 的项,除非这些项也在该文件夹的包含层次结构中。
图 2 表示以下访问权限控制:
- 用户 1 是项 A 的“直接允许的正文”。
- 用户 2 是项 B 的“直接允许的主账号”。
- 用户 3 是项 C 的“直接允许的主账号”。
- 项 C 继承项 A 的 ACL。
- 项 B 指定项 A 作为其容器。
- 项 C 指定项 B 作为其容器。
根据这些控制,访问规则如下:
- 间接访问权限来自
setInheritFrom方法。用户 1 可以访问项 C,因为项 C 继承自项 A。 - 间接访问权限并非来自包含关系。用户 2 无法访问项 C。
setInheritFrom
方法。将 ACL 继承与包含关系分离,让您可以为许多结构建模。
删除项时:
- 包含被删除项的任何项都将无法搜索,并且系统会安排将其删除。
- 在
setInheritFrom中指定了被删除项的任何项都将无法搜索。
如果资源对被删除项使用 setInheritFrom,但未设置容器,或者其层次结构中不包含被删除项,则该项会保留在数据源中。您有责任将其删除。
图 3 显示了项层次结构的删除示例。
图 3 表示以下访问权限控制:
- 用户 1 是项 A 的“直接允许的正文”。
- 用户 2 是项 D 的“直接允许的正文”。
- 项 D 和项 E 都继承自项 A。
- 项 D 指定项 A 作为其容器。
- 项 A 和项 E 是根级项。
删除操作通过容器引用进行级联。删除项 A 时:
setInheritFrom引用的所有后代都将失去访问权限。- 用户将无法再访问项 A。
- 项 D 会被隐式删除,并且无法访问。
- 项 E 不会被删除,但会无法访问且无法搜索。