LDAP: error code 21 - objectClass: value #0 invalid per syntax 原因分析
根本原因是在LDAP中增删改时,操作数据的ObjectClass与原LDAP中一致。
一、ObjectClass类型不一致会导致添加失败的原因
目(Entry)就是目录管理的对象,他是LDAP中最基本的颗粒。通常对LDAP的添加、删除、更改、检索都是以条目为基本对象的。每个条目都可以有很多属性(Attribute)。对象类(ObjectClass)是属性的集合。
通过对象类可以方便的定义条目类型。每个条目可以直接继承多个对象类,这样就继承了各种属性。如果2个对象类中有相同的属性,则条目继承后只会保留1个属性。对象类同时也规定了那些属性是基本信息,必须含有(Must或Required,必要属性):哪些属性是扩展信息,可以含有(May或Optional,可选属性)。
在LDAP目录树中每一个Entry必须属于自身条件的对象类objectClass,然后再定义其条目属性及对应的值, objectClass对应Java的方式便是class。在Java中Class大致可以分为Abstract,concrete两种,只有concrete Class才能生成instance。而在LDAP中objectClass分为三种:Abstract,Structural,Auxiliary 。具体定义如下:
- **Abstract :**抽象对象类只打算被其他对象类扩展。一个条目必须不包含任何抽象类,除非它也包含一个结构或辅助类,dervies从抽象类(即包括非抽象对象类,抽象类的继承链)。所有条目必须至少包含“顶部”抽象对象类,在继承链中包含它们的结构类。它们在结构类或它们的任何辅助类中可能包含或不包含继承链中的其他抽象类。
- **Structural :**结构化对象类旨在定义一个条目代表的关键。每个条目都必须包含一个结构化对象类链,并且该链的根必须最终是“Top”抽象对象类。不允许更改条目的结构对象类。
- **Auxiliary :**辅助对象类旨在定义条目的附加质量。一个条目可能包含零个或多个辅助类,与一个条目相关联的辅助类集合可能随时间而变化。
对象类本身是可以相互继承的,所以对象类的根类是top抽象型对象类。以门禁设备为例,他们的继承关系如图:
DAP 条目的属性能否添加取决于条目所继承的objectClass 是否包含此属性。objectClass具有继承关系,也就是说,条目添加的属性最终取决于自身所继承的所有objectClass 的集合。
objectClass 和Attribute 由schema 文件来规定,存放在/etc/openldap/schema 目录下,schema 文件规范objectClass 的构成以及属性和值在目录树中的对应关系。可以通过定义schema 文件来产生objectClass,从而生成所需要的属性。 对象类(ObjectClass)、属性类型(AttributeType)、语法(Syntax)之前定的关系如图:
所以,如果所添加的属性不在objectClass 范围内,此时目录服务器不允许添加此属性。如果要添加,就必须添加schema 文件产生objectClass 所对应的属性。