第5回 根据用户匹配信息 – 按部门和权限控制搜索结果

前言

上一篇文章介绍了如何整合多个数据源实现跨源搜索。 然而,当跨源搜索成为可能后,新的问题也随之出现。 那就是如何控制”可以展示的信息”和”不可以展示的信息”。

如果人事部门的机密资料出现在全体员工的搜索结果中,将会引发严重问题。 本文将利用 Fess 的基于角色的搜索功能,设计并构建根据用户所属部门和权限来控制搜索结果的方案。

目标读者

  • 需要对搜索结果进行访问控制的人员

  • 希望构建考虑信息安全的企业内部搜索平台的人员

  • 具备 Active Directory 和 LDAP 基础知识的人员

场景

某企业有3个部门:

  • 销售部: 管理客户信息、报价单、提案书

  • 开发部: 管理设计文档、源代码规格书、会议记录

  • 人事部: 管理人事评估、薪资信息、就业规章

此外,还有所有部门都可以查阅的公共文档(公司规章制度、员工福利指南等)。

希望实现以下搜索体验:

  • 销售部员工只能搜索到销售部和公共文档

  • 开发部员工只能搜索到开发部和公共文档

  • 人事部员工只能搜索到人事部和公共文档

  • 管理层可以搜索到所有文档

基于角色的搜索机制

Fess 的基于角色的搜索按以下流程运作:

  1. 爬取时: 为文档附加角色信息(哪些角色可以访问)

  2. 登录时: 获取用户的角色信息(Fess 内部认证或外部认证集成)

  3. 搜索时: 仅在搜索结果中显示与用户角色匹配的文档

通过这一机制,在搜索引擎层面实现了访问控制。

角色设计

用户与组的设计

首先,整理 Fess 中用户、组和角色的关系。

角色设计
角色 可访问的文档
sales(销售部) sales_role 销售部文档 + 公共文档
engineering(开发部) engineering_role 开发部文档 + 公共文档
hr(人事部) hr_role 人事部文档 + 公共文档
management(管理层) management_role 所有文档

在 Fess 中设置组和角色

创建角色

  1. 在管理界面中选择 [用户] > [角色]

  2. 创建以下角色

    • sales_role

    • engineering_role

    • hr_role

    • management_role

创建组

  1. 选择 [用户] > [组]

  2. 创建以下组

    • sales

    • engineering

    • hr

    • management

创建用户并分配角色

  1. 选择 [用户] > [用户]

  2. 为每个用户分配组和角色

在爬取设置中分配权限

要为文档附加访问控制信息,需要在爬取设置中指定权限。 权限以 {role}角色名{group}组名{user}用户名 的格式,以换行分隔输入。

各部门的爬取设置

销售部的文件服务器

  1. [爬虫] > [文件系统] > [新建]

  2. 进行以下设置

    • 路径: smb://fileserver/sales/

    • 权限: 以换行分隔输入 {role}sales_role{role}management_role

通过此设置,从销售部文件服务器爬取的文档,仅拥有 sales_rolemanagement_role 的用户才能在搜索结果中查看。

开发部的文件服务器

  1. [爬虫] > [文件系统] > [新建]

  2. 进行以下设置

    • 路径: smb://fileserver/engineering/

    • 权限: 以换行分隔输入 {role}engineering_role{role}management_role

人事部的文件服务器

  1. [爬虫] > [文件系统] > [新建]

  2. 进行以下设置

    • 路径: smb://fileserver/hr/

    • 权限: 以换行分隔输入 {role}hr_role{role}management_role

公共文档

  1. [爬虫] > [Web] 或 [文件系统] > [新建]

  2. 权限: 保持默认的 {role}guest

默认情况下会自动填入 {role}guest。由于包括访客用户在内的所有用户都拥有 guest 角色,因此所有用户都可以在搜索结果中查看。

与外部认证的集成

在实际的企业环境中,大多数情况下希望与现有的目录服务集成,而非使用 Fess 自身的用户管理。

Active Directory / LDAP 集成

Fess 支持 LDAP 集成,可以使用 Active Directory 的用户信息进行认证和角色分配。

要启用 LDAP 集成,需要在 Fess 的配置文件中设置 LDAP 连接信息。

主要配置项如下:

  • LDAP 服务器的 URL

  • 绑定 DN(连接用账户)

  • 用户搜索的基础 DN

  • 组搜索的基础 DN

  • 用户属性映射

启用 LDAP 集成后,用户可以使用 Active Directory 账户登录 Fess。 由于所属组的信息会自动映射为角色,因此无需在 Fess 中为每个用户手动设置角色。

SSO 集成

作为更高级的配置,还可以与单点登录(SSO)集成。 Fess 支持以下 SSO 协议:

  • OpenID Connect (OIDC): Entra ID (Azure AD)、Keycloak 等

  • SAML: 与各种 IdP 的集成

  • SPNEGO/Kerberos: Windows 集成认证

通过 SSO 集成,用户使用日常的登录信息即可自动访问 Fess,角色信息也会自动映射。 SSO 集成的详细内容将在第15回”安全搜索平台”中详细介绍。

验证

角色搜索设置完成后,让我们验证其运行效果。

验证步骤

  1. 使用销售部用户登录,搜索”报价单” → 确认仅显示销售部和公共文档

  2. 使用开发部用户登录,搜索相同关键词 → 确认不显示销售部的文档

  3. 使用管理层用户登录,搜索相同关键词 → 确认显示所有部门的文档

验证要点

  • 确认没有权限的文档完全不出现在搜索结果中

  • 确认公共文档对所有用户都能显示

  • 确认未登录状态下的搜索行为(访客显示的范围)

设计注意事项

角色的粒度

角色的粒度应根据组织结构和安全需求来决定。

粗粒度: 按部门设置角色(本文的场景)

  • 优点: 设置简单,管理方便

  • 缺点: 无法在部门内部进行细粒度的访问控制

细粒度: 按项目或团队设置角色

  • 优点: 可以实现精细的访问控制

  • 缺点: 角色数量增多,管理变得复杂

建议先从粗粒度开始,根据需要逐步细化。

与文件服务器 ACL 的联动

在爬取文件服务器时,也可以利用文件的 ACL(访问控制列表)信息来进行权限控制。 在这种情况下,文件系统上的权限设置会直接反映到搜索结果的显示控制中。

如果要利用文件服务器的 ACL,请确认爬取设置中与权限相关的配置项。

总结

本文使用 Fess 的基于角色的搜索功能,设计并构建了按部门控制搜索结果的方案。

  • 角色、组和用户的设计与注册

  • 在爬取设置中分配角色

  • 通过 Active Directory / LDAP 集成实现角色自动映射

  • SSO 集成的选择(OIDC、SAML、SPNEGO)

通过基于角色的搜索,可以在保障信息安全的同时,提供跨源搜索的便利性。 基础篇到此结束。从下一篇开始,我们将进入实践方案篇,介绍开发团队知识中心的构建。

参考资料