【问题标题】:LDAP search base DN not workingLDAP 搜索库 DN 不起作用
【发布时间】:2013-06-23 14:26:57
【问题描述】:

我正在尝试对位于目录根目录的许多不同 OU 执行 LDAP 搜索。

上下文初始化:

Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_CREDENTIALS, "somePassword");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.SECURITY_PRINCIPAL, "MYDOMAIN\\\\myUsername");
env.put(Context.PROVIDER_URL, "ldap://myLdapServer:389");
searchControls = new SearchControls();
searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);
ctx = new InitialDirContext(env);

所以为了搜索我调用的用户

ctx.search("OU=OrgUnitOne,DC=mysite,DC=com", "(sAMAccountName=someUserName)", searchControls)

ctx.search("OU=OrgUnitTwo,DC=mysite,DC=com", "(sAMAccountName=someUserName)", searchControls)

两者都可以正常工作。但由于我想搜索 DA 根目录中的所有 OU,我必须使用另一个 baseDN 进行搜索,但我没有找到。我尝试了以下方法,但似乎都没有效果......

没有 OU:

ctx.search("DC=mysite,DC=com", "(sAMAccountName=someUserName)", searchControls)
//output:
//javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name 'DC=mysite,DC=com'

searchBase字符串:

ctx.search("", "(sAMAccountName=someUserName)", searchControls)
//output:
//javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-031001E5, problem 2001 (NO_OBJECT), data 0, best match of:'']; remaining name ''

绝望的通配符 *

ctx.search("OU=\*,DC=mysite,DC=com", "(sAMAccountName=someUserName)", searchControls)
//output:
//javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:'DC=mysite,DC=com']; remaining name 'OU=*,DC=mysite,DC=com'

绝望的通配符 %

ctx.search("OU=%,DC=mysite,DC=com", "(sAMAccountName=someUserName)", searchControls)
//output:
//javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:'DC=mysite,DC=com']; remaining name 'OU=%,DC=mysite,DC=com'

绝望的 OR 运算符 |

ctx.search("OU=OrgUnitOne|OrgUnitTwo,DC=mysite,DC=com", "(sAMAccountName=someUserName)", searchControls)
//output:
//javax.naming.NameNotFoundException: [LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:'DC=mysite,DC=com'];    

其余名称'OU=OrgUnitOne|OrgUnitTwo,DC=mysite,DC=com'

有没有办法实现对所有根 OU 的搜索?

【问题讨论】:

  • 您是否考虑过查找javax.naming.PartialResultException 的文档?而不是胡乱猜测?

标签: java ldap jndi distinguishedname ou


【解决方案1】:

这对我有用:

Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ldapEnv.put(Context.PROVIDER_URL,  "ldap://ldapHost");
ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
ldapEnv.put(Context.SECURITY_PRINCIPAL, "CN=Administrator,CN=Users,DC=domain,DC=com");
ldapEnv.put(Context.SECURITY_CREDENTIALS, "secret");
ldapContext = new InitialDirContext(ldapEnv);
// Create the search controls         
SearchControls searchCtls = new SearchControls();
// Specify the attributes to return
String returnedAtts[]={"sn","givenName", "samAccountName"};
searchCtls.setReturningAttributes(returnedAtts);
// Specify the search scope
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
// specify the LDAP search filter
String searchFilter = "(&(samAccountName=userName))";
// Specify the Base for the search
String searchBase = "dc=domain,dc=com";
// initialize counter to total the results
int totalResults = 0;
// Search for objects using the filter
NamingEnumeration<SearchResult> answer = ldapContext.search(searchBase, searchFilter, searchCtls);
// Loop through the search results
while (answer.hasMoreElements()) {
    SearchResult sr = (SearchResult)answer.next();
    totalResults++;
    System.out.println(">>>" + sr.getName());
    Attributes attrs = sr.getAttributes();
    System.out.println(">>>>>>" + attrs.get("samAccountName"));       
}
System.out.println("Total results: " + totalResults);
ldapContext.close();

【讨论】:

    【解决方案2】:

    使用所需的基本对象、sub 的搜索范围、将返回的条目限制为所需条目的过滤器以及请求的属性列表构造一个搜索请求。使用 UnboundID LDAP SDK:

    SearchRequest req = new SearchRequest("dc=mysite,dc=com",
           SearchScope.SUB,"samAccountName=someUserName","1.1");
    SearchResult searchResult = ldapConnection.search(req);
    

    此搜索将返回所有条目(1.1 表示不返回任何属性,将其替换为所需的属性列表),其中 samAccounName 属性包含值“someUserName”(使用匹配规则执行值匹配) 如果服务器允许。在某些情况下,服务器管理员可能不允许此搜索,因为它遍历整个目录服务器数据库。此外,连接的授权状态必须允许检查samAccountName。请注意,搜索可能会成功(结果代码 SUCCESS,整数 0),但不会返回任何条目。

    • 可分辨名称没有“或”运算符。
    • 专有名称中没有“通配符”运算符

    【讨论】:

    • 非常感谢 Terry,但我可能无法使用 UnboundID SDK,所以我想知道是否可以使用 javax.naming API 指定基础对象“dc=mysite,dc=com” .
    • 当您从dc=mysite,dc=com 开始进行搜索时,您的客户似乎收到了一个延续参考。您可能需要关注推荐。
    • @Terry Gardner 您提供的链接已损坏。请用工作的更新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2016-08-04
    • 2013-09-24
    • 2013-11-26
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多