Spring LDAP ldapTemplate.modifyAttributes(上下文)用户组更新问题



我们正在尝试为新创建的用户更新用户组。更新用户组中的用户可以正常工作,但当我们尝试更新用户(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);

寻求任何建议。

处理包含可分辨名称的属性时的问题是,可分辨名称与字符串的语义相等不同。例如,DN cn=John Doe,ou=Accounting,dc=example,dc=com在语义上等于DN CN=John Doe, OU=Accounting, DC=example, DC=com。幸运的是,DirContextAdapter可以开箱即用地支持这一功能。

当使用DirContextAdapter向属性添加和删除值时,它试图弄清楚添加和删除了哪些值,以便使实际更新尽可能高效。如果将可分辨名称作为字符串处理,则这不会按要求工作,但如果明确告诉DirContextAdapter将属性中的值作为可分辨名称处理,则会正常工作。告诉DirContextAdapter用可分辨名称相等来处理属性的方法是向addAttributeValue/removeAttributeValue提供javax.naming.Name实例,例如:

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将自动确保添加/删除适当的属性值。

最新更新