Spring LDAP ldapTemplate.modifyAttributes(context) Обновление группы пользователей Проблема

Мы пытаемся обновить группу пользователей для вновь созданного пользователя. Обновление пользователей в группе пользователей работает нормально, но когда мы пытаемся обновить информацию о группе пользователей для пользователя (memberOf), это не работает должным образом.

Проблемы:

  1. ldapTemplate.modifyAttirbutes для обновления группы пользователей удалена ассоциация групп пользователей для существующих пользователей в LDAP, что стало для нас очень важной проблемой.
  2. ldapTemplate.modifyAttirbutes не обновил информацию о группе пользователей для пользователя, для которого мы пытаемся обновить атрибут группы пользователей (memberOf).

Еще одно вредоносное поведение заключается в том, что тот же код отлично работает в среде разработки, как и ожидалось, но не работает в нашей среде следующего уровня (UAT).

Скопировал приведенный ниже фрагмент кода:

Name dn = EnterpriseDirectoryServiceHelper.buildDn(uid, getDirectory(directory));
DirContextOperations context = ldapTemplate.lookupContext(dn);
String[] memberOfArr = context.getStringAttributes("memberOf");
List<String> memberOfList = new ArrayList<String>();
if (memberOfArr != null)
    memberOfList = Arrays.asList(memberOfArr);

List<String> fullyQualifiedUserGrps = 
        EnterpriseDirectoryServiceHelper.buildMemberUserGroups(
                userGroupNames, userGroupsBaseDirectory, baseDirectory);
for (String group : fullyQualifiedUserGrps) {
    if (!memberOfList.contains(group))
        context.addAttributeValue("memberOf", group);
    System.out.println("group inside context addition" +group);
}

ldapTemplate.modifyAttributes(context);

Жду любых советов.


person Saran    schedule 10.11.2014    source источник


Ответы (1)


Проблема при работе с атрибутами, содержащими различающиеся имена, заключается в том, что семантическое равенство для различающихся имен отличается от равенства строк. Например, DN cn=John Doe,ou=Accounting,dc=example,dc=com семантически равно DN CN=John Doe, OU=Accounting, DC=example, DC=com. К счастью, DirContextAdapter поддерживает это из коробки.

При добавлении и удалении значений атрибута с помощью DirContextAdapter он пытается выяснить, какие значения добавляются и удаляются, чтобы сделать фактическое обновление максимально эффективным. Это не работает должным образом, если вы обрабатываете отличительные имена как строки, но если вы явно указываете DirContextAdapter обрабатывать значения в атрибуте как различающиеся имена, все будет работать нормально. Способ сообщить DirContextAdapter обработать атрибут с равенством выдающихся имен состоит в том, чтобы предоставить javax.naming.Name экземпляров для addAttributeValue/removeAttributeValue, например:

public void addUserToGroup(String uid, String groupName) {
  DirContextOperations ctx = ldapTemplate.lookupContext(buildUserDn(uid));
  ctx.addAttributeValue("memberOf", buildGroupDn(groupName));

  ldapTemplate.modifyAttributes(ctx);
}

Удаление пользователя из группы будет работать аналогично, только вместо этого используйте removeAttributeValue. Теперь, если buildGroupDn возвращает экземпляр javax.naming.Name, DirContextAdapter автоматически добавит/удалит соответствующие значения атрибутов.

person marthursson    schedule 11.11.2014