问题现象
由于LDAP
没有在单个事务中执行两个操作的标准化方法,因此中间目录
状态(在删除之后,在添加之前)对于其他客户端是可见的, 这可能导致不良的客户端行为。基于这个考虑早期 LDAP
没有提供修改条目对象类的功能。
当你尝试修改条目的对象类的时候会提示你structural object class modification from X to Y not allowed
,具体提示如下:
[core@localhost tmp]$ ldapmodify -h home.coocn.cn -D "cn=root,dc=coocn,dc=cn" -w Root.123 -f p2op.ldlf
modifying entry "uid=test,ou=public,dc=coocn,dc=cn"
ldap_modify: Cannot modify object class (69)
additional info: structural object class modification from 'person' to 'organizationalPerson' not allowed
p2op.ldlf
文件内容:
[core@localhost tmp]$ cat p2op.ldlf
dn: uid=test,ou=public,dc=coocn,dc=cn
changetype: modify
delete: objectClass
objectClass: person
-
add: objectClass
objectClass: organizationalPerson
-
解决方案
openldap
从 2.4 开始提供了manageDIT
功能来支持修改条目的对象类,只需要在执行修改的时候通过参数 -e manageDIT
开启 manageDIT
功能的支持就可以了
[core@localhost tmp]$ ldapmodify -h home.coocn.cn -D "cn=root,dc=coocn,dc=cn" -w Root.123 -e manageDIT -f p2op.ldlf
modifying entry "uid=test,ou=public,dc=coocn,dc=cn"