我们正在尝试为新创建的用户更新用户组。更新用户组中的用户可以正常工作,但是当我们尝试更新用户的用户组信息时(memberOf)并没有按预期工作。
的问题:
ldapTemplate.modifyAttirbutes
用于用户组更新删除了LDAP中现有用户的用户组关联,这对我们来说已成为一个非常关键的问题。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);
寻找任何建议。
答案 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
将自动确保添加/删除相应的属性值。