2016-04-13 54 views
0

我正在使用一個普通的java命令行軟件,它使用Spring LDAP執行遞歸LDAP搜索,從指定的組開始搜索指定組和子組中的所有用戶。使用組織單元的春季LDAP搜索返回零結果

如果組專有名稱包含組織單位(= ou),但在其他情況下有效,搜索將無法找到任何內容。

下面是實現短版,遞歸省略:

private void searchLdapGroup(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName) { 
    // recursion guard omitted 
    String base = groupName.substring(groupName.indexOf(',') + 1); 
    AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "group")).and(new EqualsFilter("memberof", groupName)); 
    List<String> subgroups = ldapTemplate.search(base, filter.encode(), new GroupNameMapper()); 

    // recursive calls for subgroups omitted 
    getAllUsers(users, ldapTemplate, groupName, base); 
} 

private void getAllUsers(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName, String base) { 
    AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "person")).and(new EqualsFilter("memberof", groupName)); 
    // Paged search omitted. 
    List<UserDTO> result = ldapTemplate.search(base,filter.encode(),new UserAttributesMapper()); 
    users.addAll(result);  
} 

GroupNameMapper返回的distinguishedName從不同的屬性,如sAMAccountNamegivenName字符串和UserAttributesMapper返回用戶對象。

代碼(遞歸)發現所有36級的用戶在第一試驗組,其中指定的基團是像:

CN = import_users,CN =用戶,DC =例如,DC =測試, DC =有機

在它返回零名者和子組時的組區分名稱包含一個或多個組織單元完全相同的測試環境,如

CN = import_users,OU = testou,DC =例如,DC =測試,DC =組織

這不可能是由於錯誤的組專有名稱,「成員」不工作或含基團沒有用戶,因爲我測試查找:

String[] test = (String[])ldapTemplate.lookup("CN=import_users,OU=testou,DC=example,DC=test,DC=org", new ContextMapper() { 
     public Object mapFromContext(Object ctx) { 
      DirContextAdapter adapter = (DirContextAdapter) ctx; 
      return adapter.getStringAttributes("Member"); 
     } 
}); 

指找到

CN = John Doe的,CN =用戶,DC =例如,DC =測試,DC =組織

和查找用戶John Doe的

String[] test = (String[])ldapTemplate.lookup("CN=John Doe,CN=Users,DC=example,DC=test,DC=org", new ContextMapper() { 
     public Object mapFromContext(Object ctx) { 
      DirContextAdapter adapter = (DirContextAdapter) ctx; 
      return adapter.getStringAttributes("memberof"); 
     } 
    }); 

給出的結果:

CN = import_users,OU = testou,DC =例如,DC =測試,DC =組織 CN = import_users,CN = Users,DC = example,DC = test,DC = org

當涉及組織單位時,搜索如何找不到任何東西?

庫用戶: spring-ldap-core - 2.0.4。RELEASE

回答

0

魔鬼在細節: 組CN=import_users,OU=testou,DC=example,DC=test,DC=org的構件是

CN = John Doe的,CN =用戶,DC =例如,DC =測試,DC =組織

但是你出現

OU = testou,DC =例如,DC =測試,DC =組織

下被搜索用戶10

也就是說,看起來所有用戶都在CN=Users,DC=example,DC=test,DC=org之下,但是當您實際上在搜索用戶時,您認爲他們是相對於該組進行的。

+0

是的,這似乎至少是一個部分的答案 - 用戶和組似乎在'CN = Users,DC = example,DC = test,DC = org' - 這也是遞歸也起作用的原因,因爲子組也有類似於CN = subgroup,CN = Users,DC = example,DC = test,DC = org'的dn。廣告樹和遍歷它與我認爲的不同...但這也適用於其他廣告系統,所以現在我有一堆新的問題,可能不得不廢棄當前的遍歷方法。 – arq

+0

由於您具有來自組成員屬性的用戶的完整DN,因此您可以簡單地'查找()'該DN來查找用戶。 – marthursson

+0

是的,這是做舊的方式:查找可能成千上萬的用戶和多個小組一個接一個地工作,但速度很慢 - 並且此用戶提取應該可以工作,例如。每晚一次。我嘗試了一個新的解決方案,裁剪基礎僅爲DC = example,DC = test,DC = org',並使用與之前完全相同的過濾器搜索子樹/作用域的範圍 - 似乎至少在測試中起作用環境案件。 – arq