我有两个LDAP JNDI查询,其中:
1>获取属于特定组的所有用户的列表
下面是我的代码
String group = StringUtils.isBlank(groupName) ? "*" : groupName
.endsWith("*") ? groupName : groupName + "*";
// Create the search controls
SearchControls searchCtls = new SearchControls();
// Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// specify the LDAP search filter
String searchFilter = "(&(objectClass=*)(CN=" + group + "))";
// Specify the Base for the search
// String searchBase =
// "ou=internal,ou=groups,ou=people,dc=somecomp,dc=com";
String searchBase = "";
// initialize counter to total the group members
int totalResults = 0;
// Specify the attributes to return
String returnedAtts[] = { "member" };
searchCtls.setReturningAttributes(returnedAtts);
// Search for objects using the filter
NamingEnumeration<?> answer = ctx.search(searchBase, searchFilter,
searchCtls);
2 - ;第二个获取给定用户标识的用户的所有属性
这是第二个查询的代码
String attrName = "uid="
+ userId
+ ","
+ (isInternal ? "ou=internal,"
: isExternal ? "ou=external,"
: LDAPServicesConstants.EMPTY_STRING)
+ "ou=people,dc=somecomp,dc=com";
Attributes attrs = ctx.getAttributes(attrName);
if (attrs != null) {
for (NamingEnumeration<?> ae = attrs.getAll(); ae.hasMore();) {
Attribute attr = (Attribute) ae.next();
String uidAttribute = attr.getID();
if (!LDAPHelperUtilities.isSystemAttribute(ctx,
uidAttribute)) {
ArrayList<String> attrValues = new ArrayList<String>();
for (NamingEnumeration<?> attrEnum = attr.getAll(); attrEnum
.hasMore(); attrValues.add(String
.valueOf(attrEnum.next()))) {
}
userAttrs.put(uidAttribute.toLowerCase(),
(String[]) attrValues
.toArray(new String[0]));
log.debug("value(s) : "
+ Arrays.asList((String[]) userAttrs
.get(uidAttribute.toLowerCase())));
}
}
我需要将这两个查询合并为一个,因为从第一个调用每个uid的第二个不是一个选项(它可能会返回数千个用户)。
有没有办法可以将这两者结合起来并为每个用户返回一组属性集合
谢谢
答案 0 :(得分:1)
只需将'returnedAtts'从“member”更改为“*”即可。这为您提供了所有(非操作)属性。
答案 1 :(得分:1)
如果是Active Directory,我会说使用(&(objectClass=user)(memberOf=groupDN))
。
检查您的LDAP服务器在用户对象上是否有类似字段,即指向用户所属组的字段。然后使用此字段构建过滤器。因此,您将只有两个查询 - 一个用于组DN,另一个用于所有用户。