添加自定义objectclass时报LDAP错误no database configured for that naming context
问题根因分析
- 你的schema文件语法本身没有错误,
instanceType属性和自定义user对象类的定义符合OpenLDAP schema规范。补充说明:user是Windows Active Directory的原生对象类,OpenLDAP默认没有内置该对象类,因此你需要自定义的需求是合理的。 - 你遇到的slapadd报错,是因为slaptest生成的LDIF是为全新配置目录生成的带顺序前缀的完整schema条目,直接往已运行过的OpenLDAP的
cn=config数据库导入时,条目命名上下文与现有配置不匹配导致导入失败。
可行解决方案
方案1:动态导入schema(推荐,无需停服务)
- 打开你生成的
cn={0}object_class.ldif文件,删除自动生成的元数据(包括dn: cn=config相关行、entryUUID/creatorsName/createTimestamp等自动生成属性),去掉dn里的{0}顺序前缀,修改后的LDIF结构如下:
dn: cn=object_class,cn=schema,cn=config objectClass: olcSchemaConfig cn: object_class olcAttributeTypes: ( 1.3.6.1.4.1.42.2.27.4.1.6 NAME 'instanceType' DESC 'instanceType attribute' EQUALITY caseExactMatch SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE ) olcObjectClasses: ( 1.3.6.1.4.1.42.2.27.4.2.1 NAME 'user' DESC 'user object' SUP top STRUCTURAL MUST ( cn $ instanceType ) )
- 执行以下命令动态导入schema,无需停止slapd服务:
ldapadd -Y EXTERNAL -H ldapi:/// -f 你修改后的LDIF文件路径
- 导入完成后可执行以下命令验证schema是否生效:
ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=schema,cn=config '(cn=object_class)'
方案2:静态加载schema(适合全新部署场景)
如果你的OpenLDAP还未做其他业务配置,可以直接修改slapd主配置文件(默认路径为/etc/openldap/slapd.conf,或你自定义的配置文件),添加一行配置:
include /ldap-data/object_class.schema
之后重启slapd服务即可生效,不需要手动用slaptest生成LDIF再导入。
补充优化建议
- 如果你导入的用户数据兼容标准person类属性,建议将自定义
user对象类的父类从top改为organizationalPerson,可以直接复用默认已有的姓名、邮箱、电话等属性定义,减少自定义工作量。 - 自定义对象类和属性尽量不要占用现有厂商预留的OID段,如果你后续需要扩展其他属性,建议申请私有OID段避免冲突。
- 如果需要完全兼容AD的
user对象类属性,可以直接引入OpenLDAP的ad.schema扩展包,不需要全量自定义,可减少后续属性不兼容问题。
内容的提问来源于stack exchange,提问作者unit_1
相关产品推荐
相关产品推荐

