我有一个使用本机实现在 OpenBSD 7.1 上运行的 LDAP 服务器ldapd
。我创建了一个基本的 DIT,当尝试添加用户时,我得到:
# ldapadd -vv -H ldaps://hypnos.spookyinternet.com/ -f /tmp/users.ldif -D cn=admin,dc=spookyinternet,dc=com -w 'correct horse battery staple'
ldap_initialize( ldaps://hypnos.spookyinternet.com:636/??base )
add objectClass:
inetOrgPerson
add uid:
jessejames
adding new entry "uid=jessejames,ou=users,ou=accounts,ou=spookyinternet,dc=spookyinternet,dc=com"
ldap_add: Object class violation (65)
哪里/tmp/users.ldif
:
dn: uid=jessejames,ou=users,ou=accounts,ou=spookyinternet,dc=spookyinternet,dc=com
objectClass: inetOrgPerson
uid: jessejames
我查看了inetOrgPerson
模式,但看不出我违反了课程的哪一部分,特别是因为没有一个字段是必须的:
objectclass ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson'
SUP organizationalPerson
STRUCTURAL
MAY ( audio $ businessCategory $ carLicense $ departmentNumber $
displayName $ employeeNumber $ employeeType $ givenName $
homePhone $ homePostalAddress $ initials $ jpegPhoto $
labeledURI $ mail $ manager $ mobile $ o $ pager $
roomNumber $ secretary $ uid $ x500uniqueIdentifier $
preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )
我在网上找到的所有实例ldap_add: Object class violation (65)
都附带一条消息来表明违规行为是什么,但不幸的是,我无法从我的客户那里(从包裹中openldap-client
)获得更具体的信息。
答案1
对象inetOrgPerson
类补充剂 organizationalPerson
,这补充了person
,这又补充了top
。这意味着,它继承这些 objectClasses 中定义的所有属性。其中一些属性被声明为必须的,您需要全部指定。请参阅RFC2798(还调查RFC4519)
例如,它继承自person
:MUST (sn $ cn)
,以及top
:MUST ( objectClass )
。因此,您也需要在 LDIF 中定义所有这些。
此外,某些目录还要求您指定所有 objectClasses,直至top
:
dn: uid=jessejames,ou=users,ou=accounts,ou=spookyinternet,dc=spookyinternet,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
uid: jessejames
cn: Jesse
sn: James
此 LDIF 应该可以工作(前提是您已经添加了所有容器:ou=users
、ou=accounts
等)。但是,这显然是多余的,我建议您尝试仅inetOrgPerson
声明类,看看它是否能正常工作。
如果你只对uid
属性感兴趣,而不想添加sn
和,你根本cn
不应该使用 objectClass 。你可以采取其他路线并使用inetOrgPerson
uidObject
辅助的objectClass 仅包含此uid
属性:
dn: uid=jessejames,ou=users,ou=accounts,ou=spookyinternet,dc=spookyinternet,dc=com
objectClass: top
objectClass: uidObject
uid: jessejames
在这种情况下,您必须在 LDIF 中指定两个对象类,因为uidObject
不是结构对象类,而最简单的结构对象类是基础top
。并且您inetOrgPerson
以后可以随时添加(或任何其他)具有其所有必需属性的对象类。