2012-07-03 8 views
11

私はこのサイトのLDAP SDK:https://www.unboundid.com/products/ldap-sdk/を使用しています。 多くのエントリを返す検索操作をしたいと思います。LDAP:1000以上の結果を返す方法(java)

FAQのサイト(https://www.unboundid.com/products/ldap-sdk/docs/ldapsdk-faq.php#search)によると、私はSearchResultListenerの実装を使用する必要があります。だからここ

は私がやったことです:

public class UpdateThread extends Thread implements SearchResultListener { 
... 
// create request 
final SearchRequest request = new SearchRequest(this, instance.getBaseDN(),SearchScope.SUB, filter); 
// Setting size limit of results. 
request.setSizeLimit(2000); 

... 

// Get every result one by one. 
@Override 
public void searchEntryReturned(SearchResultEntry arg0) { 
    System.out.println("entry "+arg0.getDN()); 

} 

問題は「searchEntryReturnedは」1000の結果の最大値を返すことです。サイズ制限を "2000"に設定しても。

答えて

8

サーバーが1000エントリのサイズ制限を実施していることはほぼ確実ですが、要求を複数の部分で発行することで回避する可能性があります。

サーバーが単純なページング結果コントロール(RFC 2696で定義され、https://docs.ldap.com/ldap-sdk/docs/javadoc/com/unboundid/ldap/sdk/controls/SimplePagedResultsControl.htmlに従ってLDAP SDKでサポートされている)の使用をサポートしている場合は、これを使用して、指定された結果を含む「ページ」の結果を反復処理できますエントリ数。

また、仮想リストビュー(VLV)リクエストコントロール(https://www.unboundid.com/products/ldap-sdk/docs/javadoc/index.html?com/unboundid/ldap/sdk/controls/VirtualListViewRequestControl.html)を使用することもできますが、サーバーが単純ページング結果コントロールをサポートしていない場合は、VLVリクエストコントロールでも結果はソートされ、要求を処理できるようにするには、サーバーで特別な構成が必要な場合や、かなり高価な処理が必要な場合があります。

+0

でそれは(簡単なページング結果コントロール)を働きました!大いに感謝する ! – stage

5

LDAPクライアントは、「クライアントが要求した」サイズ制限2000を設定しています。このクライアント要求の制限は、サーバーの構成で設定された制限を上書きすることはできません。クライアントが要求したサイズ制限が何であっても、サーバーのサイズ制限はそれを上書きします。ディレクトリサーバー管理者に連絡し、サイズ制限を増やすように依頼してください。

8

上記のNeilの回答に従ってサードパーティのAPIを使用せずに、LdapContextPagedResultsControlを追加することで、標準のJavaを使用してページングされたLDAPクエリを実装するのはかなり簡単です。

Hashtable<String, Object> env = new Hashtable<String, Object>(11); 
env 
    .put(Context.INITIAL_CONTEXT_FACTORY, 
     "com.sun.jndi.ldap.LdapCtxFactory"); 

/* Specify host and port to use for directory service */ 
env.put(Context.PROVIDER_URL, 
    "ldap://localhost:389/ou=People,o=JNDITutorial"); 

try { 
    LdapContext ctx = new InitialLdapContext(env, null); 

    // Activate paged results 
    int pageSize = 5; 
    byte[] cookie = null; 
    ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, 
     Control.NONCRITICAL) }); 
    int total; 

    do { 
    /* perform the search */ 
    NamingEnumeration results = ctx.search("", "(objectclass=*)", 
     new SearchControls()); 

    /* for each entry print out name + all attrs and values */ 
    while (results != null && results.hasMore()) { 
     SearchResult entry = (SearchResult) results.next(); 
     System.out.println(entry.getName()); 
    } 

    // Examine the paged results control response 
    Control[] controls = ctx.getResponseControls(); 
    if (controls != null) { 
     for (int i = 0; i < controls.length; i++) { 
     if (controls[i] instanceof PagedResultsResponseControl) { 
      PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; 
      total = prrc.getResultSize(); 
      if (total != 0) { 
      System.out.println("***************** END-OF-PAGE " 
       + "(total : " + total + ") *****************\n"); 
      } else { 
      System.out.println("***************** END-OF-PAGE " 
       + "(total: unknown) ***************\n"); 
      } 
      cookie = prrc.getCookie(); 
     } 
     } 
    } else { 
     System.out.println("No controls were sent from the server"); 
    } 
    // Re-activate paged results 
    ctx.setRequestControls(new Control[] { new PagedResultsControl(
     pageSize, cookie, Control.CRITICAL) }); 

    } while (cookie != null); 

    ctx.close(); 

例をhereからコピーしました。

4

私は@PeterKのように解決しますが、いくつかの変更

public List<MyUser> listUsers() { 
    LOG.info("listUsers() inicio"); 
    List<MyUser> users = new ArrayList<MyUser>(); 

    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CTX); 
    env.put(Context.PROVIDER_URL, 'ldap://192.168.10.10:389'); 
    env.put(Context.SECURITY_AUTHENTICATION, CONNECTION_TYPE); 
    env.put(Context.SECURITY_PRINCIPAL, USER_ADMIN_PASSWORD); 
    env.put(Context.SECURITY_CREDENTIALS, USER_ADMIN); 

    try { 
     LdapContext ctx = new InitialLdapContext(env, null); 

     // Activate paged results 
     int pageSize = 1000; 
     byte[] cookie = null; 
     ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, Control.NONCRITICAL) }); 
     int total; 

     do { 
      /* perform the search */ 
      SearchControls sc = new SearchControls(); 
      sc.setSearchScope(SearchControls.SUBTREE_SCOPE); 
      String filtro = "(&(sAMAccountName=*)&(objectClass=user))"; 
      NamingEnumeration results = ctx.search(getBaseDn(ctx), filtro, sc); 

      /* for each entry */ 
      while (results.hasMoreElements()) { 
       SearchResult result = (SearchResult) results.nextElement(); 
       Attributes attributes = result.getAttributes(); 
       //convert to MyUser class 
       MyUser user = toUser(attributes); 
       users.add(user); 
      } 

      // Examine the paged results control response 
      Control[] controls = ctx.getResponseControls(); 
      if (controls != null) { 
       for (int i = 0; i < controls.length; i++) { 
        if (controls[i] instanceof PagedResultsResponseControl) { 
         PagedResultsResponseControl prrc = (PagedResultsResponseControl) controls[i]; 
         total = prrc.getResultSize(); 
         if (total != 0) { 
          System.out.println("***************** END-OF-PAGE " + "(total : " + total + ") *****************\n"); 
         } else { 
          System.out.println("***************** END-OF-PAGE " + "(total: unknown) ***************\n"); 
         } 
         cookie = prrc.getCookie(); 
        } 
       } 
      } else { 
       System.out.println("No controls were sent from the server"); 
      } 
      // Re-activate paged results 
      ctx.setRequestControls(new Control[] { new PagedResultsControl(pageSize, cookie, Control.CRITICAL) }); 

     } while (cookie != null); 

     ctx.close(); 

    } catch (NamingException e) { 
     System.err.println("PagedSearch failed."); 
     e.printStackTrace(); 
    } catch (IOException ie) { 
     System.err.println("PagedSearch failed."); 
     ie.printStackTrace(); 
    } catch (Exception ie) { 
     System.err.println("PagedSearch failed."); 
     ie.printStackTrace(); 
    } 

    LOG.info("listUsers() size = " + (users.size())); 
    LOG.info("listUsers() fim"); 

    return users; 
} 


private MyUser toUser(Attributes attributes) throws NamingException { 
    if (attributes != null) { 
     String fullName = attributes.get("distinguishedName") != null ? attributes.get("distinguishedName").get().toString() : null; 
     String mail = attributes.get("mail") != null ? attributes.get("mail").get().toString() : null; 
     String userName = attributes.get("cn") != null ? attributes.get("cn").get().toString() : null; 
     String userPrincipalName = attributes.get("userPrincipalName") != null ? attributes.get("userPrincipalName").get().toString() : null; 

     if (userPrincipalName != null) { 
      String[] user = userPrincipalName.split("@"); 
      if (user != null && user.length > 0) { 
       userName = user[0]; 
      } 
     } 

     MyUser user = new MyUser(); 
     user.setFullName(fullName); 
     user.setEmail(mail); 
     user.setName(userName); 
     user.setUserPrincipalName(userPrincipalName); 
     user.setRoles(getRolesUser(attributes)); 

     return user; 
    } 

    return null; 
} 
+0

PeterKはあなたのメッセージを表示しません – Drew

+0

どうすればいいですか? ... –

+0

彼の答えの下にコメントを入力します。覚えておいてください:答えの下であなたの答えの下にコメントを投稿すると、あなたの答えの下に次の人々が警告されます。(1)私はそれを私に抱かないでください。 (3)誰かが、あなたのコメントまたはOpで既にあなたの答えの下にあるあなたの誰かが、 – Drew

関連する問題