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
のメンバーであるため、書き込むための十分なアクセス許可が必要です( manageは使用可能な最高レベルのアクセス許可であるため )。
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に存在する、または存在しないユーザーのインポートをテストしましたが、どちらの場合も前述のエラーが発生します。
問題の原因とそれを回避する方法を誰かが説明できますか?
これらのLDIFファイルをどのように生成しましたか? structuralObjectClass
はOpenLDAPの内部値の1つであり、ユーザー(管理者であっても)は通常これらを変更できません。
これらのstructuralObjectClass
行をLDIFから削除するか、slapadd
を使用してエントリをインポートし直します(slapcat
を使用してLDIFファイルを生成したに違いありません)。
http://phpldapadmin.sourceforge.net/wiki/index.php/Main_Page のようなツールを使用してデータをエクスポートする場合は、Web UIでInclude system attributes
を選択しないでください。
以下は問題の解決策ではありませんが、構造要素を削除するためのユーティリティコードです。サンプル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)
ldif
ファイルの次の行を削除する必要があります。
structuralObjectClass:
entryUUID:
creatorsName:
createTimestamp:
entryCSN:
modifiersName:
modifyTimestamp: