ldapadd
我在导入用户和文件时遇到问题ldif
。我收到的错误是:
ldap_add: Constraint violation (19)
additional info: structuralObjectClass: no user modification allowed
导入的用户均属于ou=People,dc=example,dc=org
。LDAP 服务器已包含此基本 DN。
该/etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif
文件包含以下 ACL 条目:
olcAccess: {2}to dn.base="ou=People,dc=example,dc=org" attrs=children by gr
oup.exact="cn=Manager,ou=Roles,dc=example,dc=org" manage
文件ldif
导入如下:
ldapadd -f import.ldif -xv -D "cn=drupal,ou=Apps,dc=example,dc=org" -h localhost -W
该cn=drupal,ou=Apps[...]
条目是的成员,cn=Manager,ou=Roles,dc=example,dc=org
因此它应该具有足够的权限进行写入(因为管理是可用的最高级别权限)。
当我发出命令时,ldapadd
导入在第一次ldif
输入时失败。完整的命令输出如下:
add objectClass:
top
person
inetOrgPerson
add uid:
John.Merrell
add mail:
[email protected]
add cn:
John D Merrell
add structuralObjectClass:
inetOrgPerson
add entryUUID:
65236c42-09b7-1020-9318-9fca7c043dfc
add creatorsName:
cn=drupal,ou=Apps,dc=bidnetwork,dc=org
add createTimestamp:
20110503095643Z
add userPassword:
2678u8yyy
add givenName:
John D
add sn:
Merrell
add entryCSN:
20110629121956.880164Z#000000#000#000000
add modifiersName:
cn=drupal,ou=Apps,dc=bidnetwork,dc=org
add modifyTimestamp:
20110629121956Z
adding new entry "[email protected],ou=People,dc=example,dc=org"
ldap_add: Constraint violation (19)
additional info: structuralObjectClass: no user modification allowed
我已经测试过导入 LDAP 中存在或不存在的用户,无论哪种情况都会出现上述错误。
有人可以解释一下问题的根源以及如何解决它吗?
答案1
您是如何生成这些 LDIF 文件的?structuralObjectClass
是 OpenLDAP 中的内部值之一,用户(甚至管理员)通常无法修改这些值。
从您的 LDIF 中删除这些structuralObjectClass
行或使用 导入条目slapadd
(我敢打赌您是使用 生成 LDIF 文件slapcat
)。
答案2
如果你使用类似这样的工具http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page要导出数据,请不要Include system attributes
在 Web UI 中选择:
答案3
您需要删除文件中的以下几行ldif
:
structuralObjectClass:
entryUUID:
creatorsName:
createTimestamp:
entryCSN:
modifiersName:
modifyTimestamp:
答案4
以下不是问题的解决方案,而是用于删除结构元素的实用代码. 示例 Python 代码删除结构元素。使用 out.ldif
structural_elements = ["structuralObjectClass","entryUUID", "creatorsName","createTimestamp","entryCSN", "modifiersName","modifyTimestamp"]
with open("ldap_data_out.ldif","w+") as outfile:
with open("ldap_data_in.ldif", "r") as infile:
lines = infile.readlines()
for line in lines:
print line.split(":")[0]
if line.split(":")[0] in structural_elements:
print "ignoring ,", line
else:
outfile.write(line)