spring-ldap автоматически выбирает операционные поля
Gooday,
Работали над инструментом, позволяющим пользователям сменить там пароль (сгенерированный). И я иду к небольшой проблеме, где используется Spring Ldap (2.1.0.RELEASE).
Теперь мы хотим установить некоторые из операционных атрибутов. Это код, который я использую:
public void updatePassword(LdapUser ldapUser) {
String[] userOrg = ldapUser.getUserName().split("@");
Name dn = buildDn(userOrg[1], ldapUser.getUserName());
DirContextOperations context = ldapTemplate.lookupContext(dn);
context.setAttributeValue(USER_PASSW, ldapUser.getUserPassword());
if(!context.attributeExists("pwdReset")) {
context.setAttributeValue("pwdReset", "TRUE");
}
ldapTemplate.modifyAttributes(context);
}
Теперь, пока рабочий атрибут pwdReset никогда не устанавливается, этот бит кода работает нормально. Но если он когда-либо был установлен (и, таким образом, это значение FALSE). Вы можете получить код ошибки:
LDAP: код ошибки 20 - изменить / добавить: pwdReset: значение #0 уже существует
Теперь я знаю, что по замыслу Ldap не возвращает операционные атрибуты. Но в Spring Ldap должен быть способ сказать ему, что вы всегда хотите иметь также Операционные атрибуты.
Любые предложения, было бы неплохо.
1 ответ
Вы проверяете не ту вещь. Проверять существование бессмысленно. Вы должны проверить, установлено ли для него значение ИСТИНА, и устанавливать его, только если это не так.
На самом деле вы должны просто удалить тест, так как тест такой же дорогой, как и набор. Я также рекомендовал бы не устанавливать его в FALSE, а полностью удалить атрибут, который имеет ту же семантику, что и FALSE. Без теста и с этим изменением вы не сможете получить эту проблему.