LDAP:不允许使用属性‘givenName’

LDAP:不允许使用属性‘givenName’

好的,我第一次学习和配置 openLDAP,部分基于本教程:

http://www.rjsystems.nl/en/2100-d6-openldap-provider.php

我正在尝试添加一个示例用户,但我想我注意到了教程中的一种类型。在示例 ldif 中,作者使用了cn: Christopher。我认为 cn 应该是一个较短的名称,如果不完全相同,则类似于 uid。因此,在我的 ldif 中,我同时设置了cngn(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中的任何一个的架构中都没有定义。toppersonshadowAccountposixAccount

相关内容