跳到主要内容

2. 目录用户信息模型

如 [X.501] 所述:

  目录的目的是保存关于某个"世界"中相关对象 (object) 的信息, 并提供
对这些信息的访问. 对象可以是任何可标识 (可命名) 的事物.

对象类 (object class) 是具有某些共同特征的一组已标识的对象或可设想
对象. 每个对象至少属于一个类. 一个对象类可以是其他对象类的子类,
在这种情况下, 前一个类 (即子类) 的成员也被视为后一个类 (即超类)
的成员. 子类还可以有子类, 如此类推, 深度不受限制.

目录条目 (directory entry) 是一个具名的信息集合, 是目录所保存信息的 基本单位. 目录条目有多种类型.

对象条目 (object entry) 表示某个特定对象. 别名条目 (alias entry) 提供 替代名称. 子条目 (subentry) 保存管理和/或操作信息.

表示目录信息库 (Directory Information Base, DIB) 的条目集合按层次组织 成树状结构, 称为目录信息树 (Directory Information Tree, DIT).

第 2.1 节描述目录信息树. 第 2.2 节讨论条目的结构. 第 2.3 节讨论条目的命名.

第 2.4 节讨论对象类. 第 2.5 节讨论属性描述. 第 2.6 节讨论别名条目.

2.1. 目录信息树​

如上所述, DIB 由按层次组织成树状结构的条目集合组成, 该结构称为目录 信息树 (DIT); 更具体地说, 它是一棵以条目为顶点的树.

顶点之间的边定义条目之间的关系. 如果存在从 X 到 Y 的边, 则 X 处的 条目是 Y 的直接上级, 而 Y 是 X 的直接下级. 一个条目的上级包括该条目 的直接上级及其所有上级. 一个条目的下级包括其所有直接下级以及这些 直接下级的下级.

类似地, 对象条目之间的上级/下级关系可用于推导它们所表示对象之间的 关系.DIT 结构规则可用于管控对象之间的关系.

注: 条目的直接上级也称为该条目的父条目, 条目的直接下级也称为该条目 的子条目. 具有同一父条目的条目称为兄弟条目.

2.2. 条目的结构​

一个条目由一组属性组成, 这些属性保存有关该条目所表示对象的信息. 一些属性表示用户信息, 称为用户属性 (user attribute). 另一些属性表示 操作和/或管理信息, 称为操作属性 (operational attribute).

一个属性由属性描述 (一个类型和零个或多个选项) 以及一个或多个关联值 组成. 通常使用属性描述来指称属性. 例如, 'givenName' 属性由属性描述 'givenName' ('givenName' 属性类型 [RFC4519] 和零个选项) 以及一个或多个 关联值组成.

属性类型规定该属性能否具有多个值, 用于构造和比较该属性值的语法和 匹配规则, 以及其他功能. 选项表示子类型和其他功能.

属性值符合为该属性类型定义的语法.

一个属性的任意两个值不得等价. 当且仅当两个值按照该属性类型的相等 匹配规则能够匹配时, 才认为它们等价. 或者, 如果属性类型未定义相等 匹配规则, 则当且仅当两个值完全相同时, 才认为它们等价.(其他限制见 2.5.1 节.)

例如, 'givenName' 属性可以有多个值, 这些值必须是目录字符串 (Directory String), 并且不区分大小写.'givenName' 属性不能同时保存 "John" 和 "JOHN", 因为按照该属性类型的相等匹配规则, 这两个值等价.

此外, 属性不得具有与其自身不等价的值. 例如, 'givenName' 属性不能将 包含替换字符 (REPLACEMENT CHARACTER, U+FFFD) 码位的目录字符串作为值, 因为按照该属性的相等匹配规则, 涉及该目录字符串的匹配结果为未定义 (Undefined).

当某个属性用于命名条目时, 在构成相对可分辨名称 (Relative Distinguished Name) 时只使用该属性的一个且仅一个值. 该值称为可分辨值 (distinguished value).

2.3. 条目的命名​

2.3.1. 相对可分辨名称​

每个条目都相对于其直接上级命名. 该相对名称称为相对可分辨名称 (Relative Distinguished Name, RDN) [X.501], 由一个或多个无序的属性值 断言 (attribute value assertion, AVA) 构成; 每个 AVA 包含一个选项数为 零的属性描述和一个属性值. 选择这些 AVA, 使其与条目的属性值 (每个值 均为可分辨值) 相匹配.

一个条目的相对可分辨名称在该条目直接上级的所有直接下级中必须唯一 (即在所有兄弟条目中唯一).

以下是 RDN 字符串表示形式的示例 [RFC4514]:

  UID=12345
OU=Engineering
CN=Kurt Zeilenga+L=Redwood Shores

最后一个是多值 RDN 的示例, 即由多个 AVA 构成的 RDN.

2.3.2. 可分辨名称​

条目的完全限定名称称为其可分辨名称 (Distinguished Name, DN) [X.501], 它是该条目的 RDN 与其直接上级 DN 的串接. 可分辨名称明确且无歧义地 指向树中的一个条目. 以下是 DN 字符串表示形式的示例 [RFC4514]:

  [email protected],DC=example,DC=com
CN=John Smith,OU=Sales,O=ACME Limited,L=Moab,ST=Utah,C=US

2.3.3. 别名​

别名 (alias), 即别名名称 (alias name), 是"通过使用别名条目为对象提供 的名称" [X.501]. 第 2.6 节描述别名条目.

2.4. 对象类​

对象类是"具有某些共同特征的一组已标识对象 (或可设想对象)" [X.501].

如 [X.501] 中所定义:

  对象类在目录中用于多种目的:

- 描述对象及与这些对象对应的条目, 并对其进行分类;

- 在适当时控制目录的运行;

- 与 DIT 结构规则规范配合, 约束条目在 DIT 中的位置;

- 与 DIT 内容规则规范配合, 约束条目中包含的属性;

- 标识由适当管理机构与特定策略相关联的条目类别.

一个对象类 (子类) 可派生自另一个对象类 (其直接超类), 后者本身又可
派生自更通用的对象类. 对于结构对象类, 此过程止于最通用的对象类
'top' (定义见第 2.4.1 节). 从某个对象类向上直至其最高层对象类的有序
超类集合称为该对象类的超类链 (superclass chain).

一个对象类可派生自两个或更多直接超类 (不属于同一超类链的超类).
子类化的这一特性称为多重继承 (multiple inheritance).

每个对象类都标识属于该类的条目中要求存在的属性集合, 以及允许存在的 属性集合. 由于某个类的条目必须满足其所属每个类的要求, 因此可以说, 对象类从其超类继承允许属性集合和要求属性集合. 子类可将其超类允许的 属性标识为要求属性. 如果某个属性同时属于两个集合, 则要求存在该属性.

每个对象类均被定义为以下三种对象类之一: 抽象 (Abstract), 结构化 (Structural) 或辅助 (Auxiliary).

每个对象类由对象标识符 (object identifier, OID) 标识, 并可选地具有一个 或多个短名称 (描述符).

2.4.1. 抽象对象类​

顾名思义, 抽象对象类提供一组基础特征, 其他对象类可据此定义并从中 继承. 除非条目属于继承自该抽象类的结构化类或辅助类, 否则该条目不能 属于抽象对象类.

抽象对象类不能派生自结构对象类或辅助对象类.

所有结构对象类都直接或间接派生自 'top' 抽象对象类. 辅助对象类不一定 派生自 'top'.

以下是 'top' 对象类的对象类定义 (见第 4.1.1 节):

  ( 2.5.6.0 NAME 'top' ABSTRACT MUST objectClass )

所有条目都属于 'top' 抽象对象类.

2.4.2. 结构对象类​

如 [X.501] 所述:

  为用于 DIT 的结构规范而定义的对象类称为结构对象类. 结构对象类
用于定义合规条目所表示对象的名称结构.

一个对象条目或别名条目恰好由一条结构对象类超类链表征, 该超类链
以一个结构对象类作为最下层对象类. 这个结构对象类称为该条目的
结构对象类.

结构对象类与相关条目之间具有如下关系:

- 符合某个结构对象类的条目应表示受该对象类约束的现实世界对象;

- DIT 结构规则只引用结构对象类; 条目的结构对象类用于规定该
条目在 DIT 中的位置;

- 条目的结构对象类与相关 DIT 内容规则共同用于控制条目的内容.

不得更改条目的结构对象类.

每个结构对象类都是 'top' 抽象对象类的直接或间接子类.

结构对象类不能以辅助对象类为子类化基础.

每个条目既属于其结构对象类, 也属于该结构对象类超类链中的所有类.

2.4.3. 辅助对象类​

辅助对象类用于扩充条目的特征. 它们通常用于扩充要求和允许在条目中 存在的属性集合. 它们可用于描述条目或条目类别.

辅助对象类不能以结构对象类为子类化基础.

一个条目可以属于与该条目结构对象类关联的 DIT 内容规则所允许的辅助 对象类集合的任意子集. 如果没有 DIT 内容规则与该条目的结构对象类 关联, 则该条目不能属于任何辅助对象类.

条目所属的辅助对象类集合可随时间变化.

2.5. 属性描述 (Attribute Descriptions)​

属性描述由一个属性类型 (见第 2.5.1 节) 和一个包含零个或多个 属性选项 (见第 2.5.2 节) 的集合组成.

属性描述由以下 ABNF 表示:

  attributedescription = attributetype options
attributetype = oid
options = *( SEMI option )
option = 1*keychar

其中, 标识属性类型, 每个

有效属性描述的示例:

  2.5.4.0
cn;lang-de;lang-en
owner

对于属性类型无法识别的属性描述, 应将其视为无法识别. 对于包含无法 识别属性选项的属性描述, 服务器必须 (SHALL) 将其视为无法识别. 客户端可以 (MAY) 将无法识别的属性选项视为标记选项 (tagging option, 见第 2.5.2.1 节).

一个条目的所有属性都必须具有互不相同的属性描述.

2.5.1. 属性类型 (Attribute Types)​

属性类型规定属性能否具有多个值, 规定用于构造和比较该属性值的语法与 匹配规则, 还规定其他功能.

如果没有为属性类型指定相等匹配:

  - 该类型的属性不能用于命名;
- 添加属性 (或替换全部值) 时, 任意两个值都不得等价 (见第 2.2 节);
- 多值属性中的单个值不得独立添加或删除;
- 无法使用这种类型的值执行属性值断言 (例如搜索过滤器中的匹配
和比较).

否则, 应使用指定的相等匹配规则来求值与该属性类型有关的属性值断言. 指定的相等规则应具备传递性和交换性.

属性类型指明属性是用户属性还是操作属性. 如果是操作属性, 属性类型还 指明其操作用途以及用户能否修改该属性. 第 3.4 节讨论操作属性.

一个属性类型 (子类型) 可以派生自更通用的属性类型 (直接超类型). 以下限制适用于子类型化:

  - 子类型必须与其直接超类型具有相同的用途,
- 子类型的语法必须与其超类型的语法相同, 或者是后者的细化, 并且
- 如果其超类型是集合属性 (collective), 子类型也必须是集合属性
[RFC3671].

如果一个属性描述仅由某个子类型组成且不含选项, 则称它是另一个属性 描述的直接描述子类型 (direct description subtype); 后者仅由该子类型 的直接超类型组成且不含选项.

每个属性类型均由一个对象标识符 (Object Identifier, OID) 标识, 还可以 由一个或多个短名称 (描述符) 标识.

2.5.2. 属性选项 (Attribute Options)​

属性描述选项有多种类别. LDAP 技术规范详细定义了其中一种: 标记选项.

并非所有选项都能与目录中保存的属性关联. 标记选项可以与其关联.

并非所有选项都能与所有属性类型结合使用. 遇到这种情况时, 应将属性 描述视为无法识别.

对于包含互斥选项的属性描述, 应将其视为无法识别. 例如, 如果 "x-foo" 与 "x-bar" 互斥, 则应将 "cn;x-bar;x-foo" 视为无法识别.

未来的文档可以规定其他类别的选项. 这些文档必须详细说明其定义的新 类别选项与标记选项之间的关系. 特别是, 这些文档必须详细说明新类别的 选项能否与目录中保存的属性关联, 新类别的选项如何影响属性值的传输, 以及如何在属性描述层次结构中处理新类别的选项.

选项表示为简短且不区分大小写的文本字符串, 并符合本文档第 2.5 节中 定义的

BCP 64, RFC 4520 [RFC4520] 详细规定了选项的注册过程.

2.5.2.1. 标记选项 (Tagging Options)​

目录中保存的属性可以具有包含任意数量标记选项的属性描述. 标记选项 之间绝不互斥.

一个具有 N 个标记选项的属性描述, 是所有具有相同属性类型且只缺少这 N 个选项之一的属性描述的直接 (描述) 子类型. 如果属性类型具有超类型, 则该属性描述也是由该超类型和这 N 个标记选项组成的属性描述的直接 (描述) 子类型. 也就是说, 'cn;lang-de;lang-en' 是 'cn;lang-de', 'cn;lang-en' 和 'name;lang-de;lang-en' 的直接 (描述) 子类型 ('cn' 是 'name' 的子类型; 两者均在 [RFC4519] 中定义).

2.5.3. 属性描述层次结构 (Attribute Description Hierarchies)​

根据属性类型的子类型化 (如第 2.5.1 节所述) 或属性标记选项的子类型化 (如第 2.5.2.1 节所述), 一个属性描述可以是零个或多个其他属性描述的 直接子类型. 这些子类型关系用于形成属性描述和属性的层次结构.

以下内容改编自 [X.501]:

  属性层次结构允许以不同粒度访问 DIB. 实现方式是: 既可以使用属性的
特定属性描述 (对属性的直接引用), 也可以使用更通用的属性描述
(间接引用) 来访问属性的值分量.

可以把语义相关的属性置于层次关系中, 其中更专门化的属性从属于更
通用的属性. 引用较通用的属性描述, 可以更容易地搜索或检索属性及其
值; 以这种方式指定的过滤器项既针对被引用的描述求值, 也针对更专门
化的描述求值.

如果选择在搜索结果中返回下级的专门化描述, 则应在其可用时返回这些
描述. 如果选择在搜索结果中返回较通用的描述, 则应在通用描述和专门
化描述可用时同时返回两者. 属性值始终应作为其自身属性描述的值返回.

对用户修改条目内容而言, 属性层次结构中的所有属性描述均被视为彼此
不同且互不相关的描述.

存储在对象条目或别名条目中的属性值只属于一个精确的属性描述. 最初
将该值添加到条目时会指明此描述.

为了管理条目的子模式, 如果条目包含某个属性描述的值, 并且该描述所属 属性层次结构中的属性类型与必需属性的类型相同, 则要求某属性为必需的 规范即得到满足. 也就是说, 'name' 或 'name;x-tag-option' 可以满足 "MUST name" 规范, 但 'CN' 或 'CN;x-tag-option' 不能满足该规范 (即使 'CN' 是 'name' 的子类型). 同样, 条目可以包含某个属性描述的值, 前提 是该描述所属属性层次结构中的属性类型已明确列入该条目所属对象类的 定义, 或者为适用于该条目的 DIT 内容规则所允许. 也就是说, "MAY name" (或 "MUST name") 允许 'name' 和 'name;x-tag-option', 但 "MAY name" (或 "MUST name") 不允许 'CN' 和 'CN;x-tag-option'.

对于其他策略管理, 除非特定管理模型的规范另有说明, 属性层次结构中的 所有属性描述均被视为彼此不同且互不相关的描述.

2.6. 别名条目 (Alias Entries)​

以下内容改编自 [X.501]:

  对象的别名或别名名称, 是通过使用别名条目为对象或对象条目提供的
替代名称.

每个别名条目的 'aliasedObjectName' 属性 (在 X.500 中称为
'aliasedEntryName' 属性) 都包含某个对象的名称. 因此, 别名条目的
可分辨名称也是该对象的名称.

注 - 'aliasedObjectName' 中的名称称为该别名所指向的名称.
它不必是任何条目的可分辨名称.

将别名名称转换为对象名称称为 (别名) 解引用 (dereferencing), 其过程
是在声称的名称中找到别名名称时, 系统地以相应
'aliasedObjectName' 属性的值替换这些别名名称. 此过程可能需要检查
多个别名条目.

DIT 中的任一特定条目都可以有零个或多个别名名称. 因此, 多个别名
条目可以指向同一个条目. 别名条目可以指向非叶条目, 也可以指向另一
个别名条目.

别名条目不得有下级条目, 因而别名条目始终是叶条目.

每个别名条目都必须属于 'alias' 对象类.

具有 'alias' 对象类的条目还必须属于允许存在适当命名属性的一个或多个 对象类, 或者受允许存在这些属性的 DIT 内容规则管辖.

示例:

  dn: cn=bar,dc=example,dc=com
objectClass: top
objectClass: alias
objectClass: extensibleObject

cn: bar
aliasedObjectName: cn=foo,dc=example,dc=com

2.6.1. 'alias' 对象类​

别名条目属于 'alias' 对象类.

  ( 2.5.6.1 NAME 'alias'
SUP top STRUCTURAL
MUST aliasedObjectName )

2.6.2. 'aliasedObjectName' 属性类型​

'aliasedObjectName' 属性保存别名所指向条目的名称. 在 X.500 中, 'aliasedObjectName' 属性称为 'aliasedEntryName' 属性.

  ( 2.5.4.1 NAME 'aliasedObjectName'
EQUALITY distinguishedNameMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.12
SINGLE-VALUE )

'distinguishedNameMatch' 匹配规则和 DistinguishedName (1.3.6.1.4.1.1466.115.121.1.12) 语法在 [RFC4517] 中定义.