Spring LDAP ldapTemplate.modifyAttributes(context)用户组更新问题

时间:2014-11-10 06:40:58

标签: spring-ldap

我们正在尝试为新创建的用户更新用户组。更新用户组中的用户可以正常工作,但是当我们尝试更新用户的用户组信息时(memberOf)并没有按预期工作。

的问题:

  1. ldapTemplate.modifyAttirbutes用于用户组更新删除了LDAP中现有用户的用户组关联,这对我们来说已成为一个非常关键的问题。
  2. ldapTemplate.modifyAttirbutes没有更新我们尝试更新用户组(memberOf)属性的用户的用户组信息。
  3. 另一个恶作剧行为是,相同的代码在开发环境中正常运行,但它在我们的下一级(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);
    

    寻找任何建议。

1 个答案:

答案 0 :(得分: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将自动确保添加/删除相应的属性值。