4.2. 使用视图创建虚拟目录层次结构


您可以创建虚拟目录树(DIT)视图来组织自定义分组或层次结构中的条目,从而从不同的视角浏览标准 DIT。这样,您可以节省目录管理成本,并通过更直观地对服务用户进行导航。

4.2.1. 关于视图

虚拟目录树视图或 视图 是标准目录树(DIT)之外的可选结构层,用于在 DIT 中分类和搜索条目。

通过使用视图,您可以创建虚拟目录层次结构,因此无论在标准 DIT 中的放置是什么,都可以轻松地导航条目。视图使用条目的属性将它们包含在虚拟层次结构中,类似于过滤的角色或动态组的成员。对于客户端应用程序,视图显示为普通容器层次结构。

这样,您可以先将条目放在扁平 DIT 中,并使用视图对复杂层次结构中的条目进行分类,而无需移动条目。另外,条目可能会出现在多个视图中,您无法使用标准 DIT 实现。

您可以将视图视为已 命名过滤。每个视图都是 nsView 对象类的条目,可能具有 nsViewFilter 属性,它表示在该视图中可见的条目。可能需要通过在过滤器中指定对象类来限制返回的条目类型。

您可以使用视图作为其他视图的容器,从而创建虚拟层次结构。嵌套视图从其上级继承过滤器,并通过将过滤器和上级过滤器与 AND 组合来限制视图,如 (& (container filter) (view filter)

当使用视图作为基础执行搜索时,与过滤器匹配的条目会从这个虚拟搜索空间返回。条目仅显示在视图下,但实际上可以存储在 DIT 中的任何位置。

注意

您可以创建测试实例,并探索查看如何从位于 /usr/share/dirsrv/data/Example-views.ldif 中示例文件中导入的数据。

4.2.2. 目录设计注意事项

当您设计目录树(DIT)时,您自然地会根据层次结构对条目进行分类,以反映机构中的层次结构。没有视图的标准 DIT 会将条目的位置与条目的可分辨名称(DN)相关联,因此更适合用于固定层次结构。

图 4.4. 基于功能单元的标准层次结构 DIT

管理视图标准 dit

但是,组织中层次结构的性质是动态的。在标准 DIT 中移动条目非常耗时,因为每次更改条目的位置时,还必须重命名条目及其所有下级。这会导致服务中断和其他费用,特别是在更改顶级子树中。

设计一个具有资源分类的平面层次结构的最好是不更改的特征,如资源类型(人员、设备等),并将此层次结构捕获到标准的扁平 DIT 中。

图 4.5. 基于资源类型的标准扁平 DIT

管理视图扁平 dit

但是,对于浏览资源,扁平 DIT 并不方便。不同的用户需要从不同的视角导航资源,如与功能单元或地理位置的关联,当扁平 DIT 时需要额外的工具或复杂的搜索查询。

克服扁平 DIT 限制的解决方案由虚拟视图层次结构提供。视图通过将条目名称与层次结构中条目的位置分离,从而允许创建灵活的层次结构。虚拟层次结构改为基于属性。

图 4.6. 带有虚拟层次结构的 DIT

管理视图虚拟 dit

4.2.3. 使用视图的好处

使用虚拟目录树视图具有自定义灵活层次结构的好处,用户更直观地浏览和使管理员比深度嵌套标准目录树(DIT)更高效维护。

扁平和灵活的命名

视图有助于将扁平命名空间用于条目,因为虚拟 DIT 视图提供类似于传统层次结构提供的导航和管理器ial 支持。

每当对 DIT 进行更改时,条目不需要移动;只有虚拟 DIT 视图层次结构会改变。由于这些层次结构不包含实际条目,因此它们非常简单,并快速修改。

在设计错误时降低成本
在部署计划期间,使用虚拟 DIT 视图会不太严重。如果在第一个实例中没有正确开发层次结构,可以在不中断服务的情况下轻松、快速地更改。
快速和便宜的维护

查看层次结构可在几分钟内完全修订,结果会立即实现,从而显著降低目录维护成本。

对虚拟 DIT 层次结构的更改会立即实现。当组织更改时,可以快速创建新的虚拟 DIT 视图。新的虚拟 DIT 视图可以与旧视图同时存在,从而促进了更逐步更改自身以及使用这些条目的应用程序。因为目录中的组织变化不是一体式操作,因此可以在一段时间内执行,无需中断服务。

增强的总体灵活性

通过使用多个虚拟 DIT 视图进行导航和管理,可以更灵活地使用目录服务。

通过虚拟 DIT 视图提供的功能,组织可以使用旧方法和新方法组织目录数据,而无需将条目放在 DIT 中的特定位置上。

直观的用户导航

视图在工作实践中提升灵活性并降低目录用户创建复杂搜索过滤器的要求,使用它们原本不需要知道的属性名称和值。

使用多种查看和查询目录信息的灵活性允许最终用户和应用程序通过分层导航更直观地找到所需的内容。

频繁搜索查询的快捷方式
虚拟 DIT 视图层次结构可以作为一种可用的查询来创建,以方便检索常见必要信息。

4.2.4. 视图与其他功能兼容

使用视图时,搜索空间仅限于单个后缀下的条目。用户必须基于视图的搜索查询的基础,以便从虚拟层次结构获得结果。您必须采取不同的方法来访问控制。您可以在视图中将条目分组与角色和服务类一起使用。

多个后端

虚拟 DIT 视图与多个后端并不完全兼容。

搜索仅限于单一后端,这意味着视图返回的条目必须位于相同的后缀下。

搜索空间

虚拟搜索空间与标准搜索空间分开。只有在搜索基于带有过滤器的视图节点时,才能访问虚拟搜索空间。否则,这是对标准目录树(DIT)的传统搜索,它不会返回虚拟 DIT 层次结构下包含的条目。

例如,基于 dc=example,dc=com 的搜索不会从虚拟搜索空间返回任何条目;实际上,没有执行 virtual-search-space 搜索。如果搜索基础如 ou=Cupertino,ou=Location Views,dc=example,dc=com,则进行视图处理。

这样,Directory 服务器可确保搜索不会产生两个位置中的条目。

Access control
使用视图时,可能需要使用稍有不同的方式来访问控制。由于目前对访问控制列表(ACL)的明确支持,在视图父级上创建基于角色的 ACL,并将角色添加到视图层次结构中的相应部分。这样,利用层次结构的 organizational 属性。
条目分组
Directory 服务器中的 类服务和 角色 都支持视图。当在视图层次结构中添加 服务或角色时,逻辑上和实际包含在视图中的条目都将被视为在范围内。这意味着,可以使用虚拟 DIT 视图来应用 角色和服务 ,但应用程序的影响甚至可以在查询扁平命名空间时看到。

4.2.5. 视图与客户端应用程序的兼容性

虚拟目录树(DIT)视图旨在模拟标准 DIT 高度。存在对于大多数应用程序而言,视图的存在应是透明的;它们不应表示它们正在使用视图。除了一些特殊情况外,用户无需了解在目录服务器实例中使用视图的目录;视图看起来和行为像标准 DIT 一样。

某些类型的应用程序可能在处理启用了视图的目录服务时出现问题。例如:

  • 使用目标条目的可分辨名称(DN)来导航 DIT 的应用程序。

    这种类型的应用程序会发现,它正在导航出条目物理存在的层次结构,而不是找到该条目的视图层次结构。这样做的原因是,通过更改条目的 DN 以符合视图的层次结构,不会尝试忽略条目的真正位置。

    这由设计 - 如果条目的真正位置进行解包,例如依赖 DN 来识别唯一条目的应用程序时,许多应用程序都无法正常工作。通过解封 DN,这种导航是客户端应用程序的一种不用技术,但无情况是那些执行此操作的客户端可能无法正常工作。

  • 使用 numSubordinates 操作属性的应用程序来确定节点下存在多少个条目。

    对于视图中的节点,这目前只有标准搜索空间中存在的条目数,忽略虚拟搜索空间。因此,应用程序可能无法在搜索中评估视图。

4.2.6. 创建视图

此流程指导您在命令行中创建虚拟目录树视图。

流程

  • 使用 ldapadd 工具添加 view 条目。

    指定 nsView 对象类,并在 nsViewFilter 属性中定义视图过滤器:

    # ldapadd -D "cn=Directory Manager" -W -H ldap://server.example.com -x
    dn: ou=PeopleInRoom0466,dc=example,dc=com
    objectClass: top
    objectClass: organizationalUnit
    objectClass: nsView
    ou: PeopleInRoom0466
    description: People in the room 0466
    nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=0466))

验证

  • 使用视图作为搜索基础执行搜索:

    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b ou=PeopleInRoom0466,dc=example,dc=com

4.2.7. 使用命令行创建索引以提高视图性能

视图基于给定的过滤器派生自搜索结果。过滤器的一部分是 nsViewFilter 中明确指定的属性;过滤器的其余部分基于条目层次结构,查找视图中包含的实际条目的 entryidparentid 操作属性。

(|(parentid=search_base_id)(entryid=search_base_id)

如果没有索引搜索的属性 - entryidparentidnsViewFilter - 中的属性,则搜索会部分取消索引,Directory 服务器会搜索整个目录树以查找匹配条目。

要提高视图性能,请按如下所示创建索引:

  • entryid 创建 相等索引 (eq)。parentid 属性默认在系统索引中索引。
  • 如果 nsViewFilter 测试存在的过滤器(属性为),则为正在测试 的属性创建存在索引 (pres)。您应该只使用此索引类型以及出现在目录条目的次要属性。
  • 如果 nsViewFilter 测试中的过滤器相等(attribute=value),请为要测试的属性创建 相等索引 (eq)。
  • 如果 nsViewFilter 中的过滤器测试了一个子字符串(attribute=value*),为要测试的属性创建 子字符串索引 (sub)。
  • 如果 nsViewFilter 中的过滤器测试了 approximation (attribute~=value),为正在测试的属性创建 大约索引 (大约)。

例如,当您使用以下视图过滤器时:

nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=*66))

您应该使用 equality 索引索引(默认完成)索引 index子字符串 索引为 roomNumber

先决条件

  • 您已了解在视图过滤器中使用的属性。

流程

  1. 可选:列出后端以确定要索引的数据库:

    # dsconf <instance_name> backend suffix list
    dc=example,dc=com (userroot)

    请注意所选的数据库名称(在括号中)。

  2. 使用所选后端数据库的 dsconfig 工具创建索引配置。

    指定属性名称、索引类型以及可选的匹配规则来设置 collation order (OID),特别是在国际化实例时。

    # dsconf <instance_name> backend index add --attr roomNumber --index-type sub userroot

    对 view 过滤器中使用的每个属性重复此步骤。

  3. 重新索引数据库以应用新索引:

    # dsconf <instance_name> backend index reindex userroot

验证

  1. 执行基于视图中使用的相同过滤器的标准目录树的搜索:

    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b dc=example,dc=com (&(objectClass=inetOrgPerson)(roomNumber=*66))
    # ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -x -b dc=example,dc=com "(&(objectClass=inetOrgPerson)(roomNumber=*66))"
  2. 查看 /var/log/dirsrv/slapd- <instance_name> /access 中的访问日志

    搜索的 RESULT 不应在详细信息中包含 note=UPartially Unindexed Filter

视图基于给定的过滤器派生自搜索结果。过滤器的一部分是 nsViewFilter 中明确指定的属性;过滤器的其余部分基于条目层次结构,查找视图中包含的实际条目的 entryidparentid 操作属性。

(|(parentid=search_base_id)(entryid=search_base_id)

如果没有索引搜索的属性 - entryidparentidnsViewFilter - 中的属性,则搜索会部分取消索引,Directory 服务器会搜索整个目录树以查找匹配条目。

要提高视图性能,请按如下所示创建索引:

  • entryid 创建 相等索引 (eq)。parentid 属性默认在系统索引中索引。
  • 如果 nsViewFilter 测试存在的过滤器(属性为),则为正在测试 的属性创建存在索引 (pres)。您应该只使用此索引类型以及出现在目录条目的次要属性。
  • 如果 nsViewFilter 测试中的过滤器相等(attribute=value),请为要测试的属性创建 相等索引 (eq)。
  • 如果 nsViewFilter 中的过滤器测试了一个子字符串(attribute=value*),为要测试的属性创建 子字符串索引 (sub)。
  • 如果 nsViewFilter 中的过滤器测试了 approximation (attribute~=value),为正在测试的属性创建 大约索引 (大约)。

例如,当您使用以下视图过滤器时:

nsViewFilter: (&(objectClass=inetOrgPerson)(roomNumber=*66))

您应该使用 equality 索引索引(默认完成)索引 index子字符串 索引为 roomNumber

先决条件

  • 在 web 控制台中登录到实例。
  • 您已了解在视图过滤器中使用的属性。

流程

  1. Database 下,从您要为其创建索引的配置树中选择一个后缀。
  2. 导航到 IndexesDatabase Indexes
  3. Add Index 按钮。
  4. 键入属性的名称,再选择属性。
  5. 选择应该为此属性创建的 Index Types
  6. (可选)添加 Matching Rules 以指定 collation order (OID),特别是在国际化实例时。
  7. 选择 Index 属性在创建后 重建索引。
  8. Create Index
  9. 对要索引的每个属性重复这些步骤。

验证

  • 通过输入 添加的属性的名称来过滤索引。
  • 新索引属性应出现在结果中。
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部