Я использую электронную почту моих пользователей в моем классе LDAP как обязательную:
// schema.ldif
objectClasses: ( 2.25.XXXX.3 NAME 'user' SUP inetOrgPerson STRUCTURAL MUST mail MAY ( XXX ) )
И мой пользователь хранится в моем ldap с DN:
mail=toto@example.com,ou=people,dc=company,dc=com
По разным причинам я хотел бы теперь использовать userId для Dn, поэтому моя схема будет выглядеть так:
// schema.ldif
objectClasses: ( 2.25.XXXX.3 NAME 'user' SUP inetOrgPerson STRUCTURAL MUST (mail, userid) MAY (XXX) )
И теперь DN будет выглядеть так (почта является обязательной, но не используется в Dn):
userid=325448,ou=people,cd=company,dc=com
Как я могу это сделать? Есть ли процедура для переноса класса объекта из одной схемы в другую?
Я могу закодировать процедуру миграции в своей программе, чтобы она выполняла итерацию по всем записям и правильно заполняла этот идентификатор пользователя, но я не смог найти ничего об этом в документации LDAP.
Другая идея - сделать userId полем MAY на первом этапе, затем заполнить его, затем сделать его ОБЯЗАТЕЛЬНЫМ, а затем использовать modifyDn для изменения DN всех пользователей. Это сработает?
Есть какие-нибудь мнения по этому поводу?
Если это может помочь, мы используем OpenDJ для LDAP-сервера.
Поскольку изменение схемы в основном совместимо (только добавление ограничения), с OpenDJ вы можете изменить определение объектного класса, удалив старое значение и добавив новое значение, используя ldapmodify (of cn = schema). Сервер OpenDJ продолжит возвращать все записи, но потребует, чтобы вы обновили записи, которые не имеют значения идентификатора пользователя, прежде чем вносить какие-либо другие изменения.
Вы можете использовать LDAP ModDN, чтобы изменить атрибут, который используется в DN для каждой записи.
Изменение LDIF будет выглядеть так:
dn: mail=toto@example.com,ou=people,dc=company,dc=com
changetype: moddn
newdn: userid=325448
deleteoldrdn: false
-
Обратите внимание, что вам не нужно останавливать сервер, чтобы внести все эти изменения.