四、objectClass 

     LDAP中,一条记录必须包含一个objectClass属性,且其需要赋予至少一个值。每一个值将用作一条LDAP记录进行数据存储的模板;模板中包含了一条记录中数个必须被赋值的属性和一系列可选的属性。如上述LDIF文件中的记录所示,objectClass的值为domain。 

     objectClass有着严格的等级之分,最顶层的类是top和alias。例如,organizationalPerson这个objectClass隶属于Person,而Person又是top的子类。 

     objectClass大致分为三类:结构型的(如:person和organizationUnit)、辅助型的(如:extensibeObject)和抽象型的(这类不能直接使用)。官方定义的objectClass,如下所示: 

alias 
applicationEntity 
dSA 
applicationProcess 
bootableDevice 
certificationAuthority 
certificationAuthority-V2 
country 
cRLDistributionPoint 
dcObject 
device 
dmd 
domain 
domainNameForm 
extensibleObject 
groupOfNames 
groupOfUniqueNames 
ieee802Device 
ipHost 
ipNetwork 
ipProtocol 
ipService 
locality 
dcLocalityNameForm 
nisMap 
nisNetgroup 
nisObject 
oncRpc 
organization 
dcOrganizationNameForm 
organizationalRole 
organizationalUnit 
dcOrganizationalUnitNameForm 
person 
organizationalPerson 
inetOrgPerson 
uidOrganizationalPersonNameForm 
residentialPerson 
posixAccount 
posixGroup 
shadowAccount 
strongAuthenticationUser 
uidObject 
userSecurityInformation 
================================================

LDAP中的objectClass与Attribute

初学LDAP时容易弄错的问题就是objectClass和Attribute之间的关系的,当时找过许多的中文资料都没有得到答案。
最近终于彻底弄明白了这个问题,于是决定做个笔记。
下面我会对照Java里面的一些概念来讲讲LDAP中的objectClass与Attribute,非常惊喜的是他们非常相似!

LDAP中每一个Entry必须属于某一个objectClass,用Java的方式来理解就是Entry是一个Instance,
而objectClass就是class。
在Java中Class可以分为Abstract,concrete两种,我们知道要new一个Instance时必须要有一个concrete Class。
在LDAP中objectClass分为三种:Abstract,Structural,AUXIALIARY。
要定义一个Entry必须包含一个Structural类型的ObjectClass,其他两个类型可包括0或多个。 
 
其中Top是一个顶级ObjectClass,里面定义了一个MUST Attribute:ObjectClass,
于是也就决定了必须有一个其它的Structural ObjectClass才能定义一个Entry.其中ObjectClass又可以存在继承关系,
该继承关系于Java中有点相似,子ObjectClass会继承父ObjectClass中的全部Attribute.
下面分析一下ObjectClass与Attribute的关系。

如同Java里面的一个类可以包括多个Field,在业务上可能会定义某些Field是必须的,另外一些是可选的。
在LDAP中也存在类似关系,
每一个ObjectClass都定义了一些Attribute,其Attribute仍然可以是ObjectClass。
在这些Attriubte中分为两种类型MUST,MAY, MUST表示这个Entry必须包括的属性,MAY为可选。
一个ObjectClass的Attribute也包括所有继承自父ObjectClass和自身定义的ObjectClass。  
下面用一个类型进行说明:
objectclass ( 2.5.6.0 NAME 'top' ABSTRACT
    MUST objectClass )
objectclass ( 1.3.6.1.4.1.1466.344 NAME 'dcObject'
    DESC 'RFC2247: domain component object'
    SUP top AUXILIARY 
    MUST dc )
上面是两个objectclass的定义,其中top为ABSTRACT,dcObject为AUXILIARY,这两个类型都不能定义Entry.下面这个LDIF文件在导入到LDAP时会出错:
dn: dc=java,dc=com
objectClass:dcObject
dc: java.com

要定义这个Entry必须找到一个STRUCTURAL类型的ObjectClass。

objectClasses: ( 2.5.6.4 NAME 'organization' 
  DESC 'RFC2256: an organization' SUP top STRUCTURAL
  MUST o 
  MAY ( userPassword $ searchGuide $ seeAlso $ businessCategory 
   $ x121Address $ registeredAddress $ destinationIndicator
   $ preferredDeliveryMethod $ telexNumber $ teletexTerminalIdentifier
   $ telephoneNumber $ internationaliSDNNumber $ facsimileTelephoneNumber
   $ street $ postOfficeBox $ postalCode $ postalAddress 
   $ physicalDeliveryOfficeName $ st $ l $ description ) )
这个objectClass的类型为STRUCTURAL,因此可以用来定义Entry.具体定义如下
dn: dc=java,dc=com
objectClass:dcObject
objectClass:organization
dc: java.com
o: java.com

其中dc:java.com为dcObject的MUST Attribute,o: java.com为organization的MUST Attribute。