UnboundID LDAP sdkを使用して、特定のユーザーが属するすべてのLDAPグループを取得するにはどうすればよいですか?(私は本当にいくつかのサンプルコードをいただければ幸いです)。
質問する
5058 次
2 に答える
3
私も同じ問題を抱えてる。ただし、Michael による解決策は再帰的に機能しないため、うまくいきません。
どうやら、すべてのグループを再帰的に取得する「魔法の」AD クエリがあるようです。「 C#を使用して再帰的なグループ メンバーシップ (Active Directory) を検索する」および「特定のユーザーを含むグループの LDAP クエリをフィルター処理する方法」を参照してください。
AD 管理者が ldifde を使用してコマンド ラインからすべてのグループを取得しましたが、クエリを UnboundID で動作させることができません。私たちの CN には内部にスペースがあり、UnboundID は奇妙な '5c' を追加します - しかし、スペースのない (技術的な) ユーザーであっても、結果は得られません。
とにかく、これが私の動作する(そして非効率的な)ソースコードです(Google Guavaを使用)。いくつかのメソッドと定数を省略しましたが、定数の値が何であるかを推測できると思いますOBJECT_CLASS
:-)
/**
* Gets the groups for a user which is identified by the filter.
* @param filter The filter that identifies the user
* @return The groups for the user
*/
private List<String> getGroups(final Filter filter) {
LDAPConnection connection = null;
try {
connection = getConnection();
String userDN = getUserDN(connection, filter);
if (userDN == null) {
return Collections.emptyList(); // No user found
}
Multimap<String, String> groupsByDN = ArrayListMultimap.create();
getGroupsRecursively(connection, userDN, groupsByDN);
Set<String> groups = new HashSet<>(groupsByDN.values());
for (String dn : groupsByDN.keySet()) {
// The user is not a group...
if (!dn.equals(userDN)) {
DN distinguishedName = new DN(dn);
for (RDN rdn : distinguishedName.getRDNs()) {
if (rdn.hasAttribute(CN)) {
groups.add(rdn.getAttributeValues()[0]);
break;
}
}
}
}
return new ArrayList<String>(groups);
} catch (LDAPException e) {
throw new RuntimeException("Can't search roles for " + filter, e);
} finally {
if (connection != null) {
connection.close();
}
}
}
/**
* Since LDAP groups are stored as a tree, this fetches all groups for a user, starting with the user's DN and then
* fetching every group's groups and so on.
* @param connection The LDAP connection
* @param distinguishedName The distinguished name for which groups are searched
* @param groupsByDN Contains a distinguished name as key and its group name as result; keys are only searched once!
* @throws LDAPSearchException if the LDAP search fails
*/
private void getGroupsRecursively(final LDAPConnection connection, final String distinguishedName,
final Multimap<String, String> groupsByDN) throws LDAPSearchException {
if (!groupsByDN.containsKey(distinguishedName)) {
Filter groupFilter = Filter.createANDFilter(Filter.createEqualityFilter(OBJECT_CLASS, GROUP),
Filter.createEqualityFilter(MEMBER, distinguishedName));
SearchResult result = getSearchResult(connection, groupFilter, CN);
List<SearchResultEntry> searchResults = result.getSearchEntries();
for (SearchResultEntry searchResult : searchResults) {
String groupName = searchResult.getAttributeValue(CN);
groupsByDN.put(distinguishedName, groupName);
getGroupsRecursively(connection, searchResult.getDN(), groupsByDN);
}
}
}
于 2013-07-09T12:35:40.890 に答える