好的,我第一次学习和配置 openLDAP,部分基于本教程:
http://www.rjsystems.nl/en/2100-d6-openldap-provider.php
我正在尝试添加一个示例用户,但我想我注意到了教程中的一种类型。在示例 ldif 中,作者使用了cn: Christopher
。我认为 cn 应该是一个较短的名称,如果不完全相同,则类似于 uid。因此,在我的 ldif 中,我同时设置了cn
和gn
(givenName),但我收到了有关 givenName 的错误:
ldap_add: Object class violation (65)
additional info: attribute 'givenName' not allowed
这是我的 ldif:
dn: cn=tarcuri,ou=groups,dc=example,dc=com
cn: jsmith
gidNumber: 20000
objectClass: top
objectClass: posixGroup
dn: uid=tarcuri,ou=people,dc=example,dc=com
uid: jsmith
uidNumber: 20000
gidNumber: 20000
objectClass: top
objectClass: person
objectClass: posixAccount
objectClass: shadowAccount
cn: jsmith
gn: John
sn: Smith
loginShell: /bin/bash
homeDirectory: /home/jsmith
userPassword: john
我该如何修改 ldif 文件以正确设置“givenName”,因为看起来 aperson
应该能够有一个名字。sn
毕竟它需要。
谢谢!!
更新因此我尝试使用inetOrgPerson
包含名字的,但是在使用 ldapsearch 检查结果后,我看到以下内容:
givenName:: VGhvbWFzIA==
它应该具有我在 ldif 中使用的给定名称。显然发生了一些事情,有人有什么见解吗?请注意 givenName 后面的两个冒号。
答案1
我耽心RFC 2256及其后代应该为此负责:根据 RFC,一个人没有 givenName,而您的 LDAP 服务器(正确地)拒绝让您分配该属性。
您有几个选择:您可以使用cn
(通用名称)作为名字,添加支持 givenName 的附加 ObjectClass(如 inetOrgPerson),或者选择不同的结构 ObjectClass(再次,如 inetOrgPerson)作为您的对象的基础。
一般来说,inetOrgPerson 是您想要使用的类似“人”的对象类:它比普通的 LDAP 人有用得多。
更新 回复:您的更新。您得到的奇怪字符串实际上givenName
是一个 base-64 编码的字符串 ( VGhvbWFzIA==
=> Thomas
)。大多数客户端都能够自动解码,我不确定您的客户端为什么不能(可能是某处配置故障)。
答案2
双冒号(::)
表示提供的值是经过 base64 编码的。使用某些旧版 OpenLDAPldapmodify
工具时经常会发生这种情况,尤其是当属性值末尾包含空格时。值的末尾不允许有尾随空格,但 OpenLDAPldapmodify
未能注意到这一事实,并仍将条目和有问题的属性发送到服务器,结果服务器正确地对属性值进行了 base64 编码。
我不知道您的示例是否如此,但有可能。请参阅我的博客条目在 ldapmodify 上。
答案3
您必须检查 objectClass 'person' 是否包含属性 'givenName'。如果不包含(很可能包含),请尝试将 'person' 替换为 'inetOrgPerson'。
答案4
当您尝试将属性分配给对象,但该属性不在该对象的任何 ObjectClasses 中时,会抛出您引用的错误消息。似乎在、、或gn
中的任何一个的架构中都没有定义。top
person
shadowAccount
posixAccount