2014-11-10 4 views
2

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

Вопросы:

  1. ldapTemplate.modifyAttirbutes для группы пользователей обновления удалено пользователем группы объединения для существующих пользователей в LDAP, которая стала очень важным вопросом для нас.
  2. ldapTemplate.modifyAttirbutes не обновлял информацию о группе пользователей, которую мы пытаемся обновить атрибут user group (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); 

Looking за любые советы.

ответ

3

Проблема при работе с атрибутами, содержащими отличительные имена, заключается в том, что семантическое равенство для выделенных имен отличается от равенства строк. Например, 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 автоматически добавит/удалит соответствующие значения атрибутов.

Смежные вопросы