我们正在尝试为新创建的用户更新用户组。更新用户组中的用户可以正常工作,但当我们尝试更新用户(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);
寻求任何建议。
处理包含可分辨名称的属性时的问题是,可分辨名称与字符串的语义相等不同。例如,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
将自动确保添加/删除适当的属性值。