3

LDAP サーバーからデータを取得しようとしていますが、失敗します。(接続作品)。最後の行の search() メソッドで必要なパラメーターを理解するのは非常に困難です...「mail」は取得しようとしている情報であり、userName は認証されるユーザーです。

 DirContext authContext = new InitialDirContext(authEnv);
 SearchControls constraints = new SearchControls();
 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
 NamingEnumeration results = authContext.search("mail", userName, constraints);

これは私のエラーメッセージです(最後の行に表示されます):

 javax.naming.directory.InvalidSearchFilterException: Missing 'equals'; remaining name 'mail'
at com.sun.jndi.ldap.Filter.encodeSimpleFilter(Unknown Source)
at com.sun.jndi.ldap.Filter.encodeFilter(Unknown Source)
at com.sun.jndi.ldap.Filter.encodeFilterString(Unknown Source)
at com.sun.jndi.ldap.LdapClient.search(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.doSearch(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.searchAux(Unknown Source)
at com.sun.jndi.ldap.LdapCtx.c_search(Unknown Source)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(Unknown Source)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(Unknown Source)
at javax.naming.directory.InitialDirContext.search(Unknown Source)
at Client.connect(Client.java:48)
at Client.main(Client.java:23)

すべての回答に感謝します。要求どおりにコードを変更すると、次のエラーが発生します。

  javax.naming.NamingException: [LDAP: error code 1 - 000004DC: LdapErr: DSID-0C0906E9, 
  comment: In order to perform this operation a successful bind must be completed on the 
  connection., data 0, v1db1

接続するための私のコードは次のとおりです。

    Properties authEnv = new Properties();
    String userName = "XXX";
    String passWord = "XXX";
    String base = "XXX";
    String dn = "uid=" + userName + "," + base;
    String ldapURL = "XXX";

    authEnv.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
    authEnv.put(Context.PROVIDER_URL, ldapURL);
    authEnv.put(Context.SECURITY_AUTHENTICATION, "none");
    authEnv.put(Context.SECURITY_PRINCIPAL, dn);
    authEnv.put(Context.SECURITY_CREDENTIALS, passWord);
4

5 に答える 5

3

スキーマを知らずに正確な答えを出すことはできません。

 LdapContext authContext = new InitialLdapContext(authEnv, null);
 SearchControls constraints = new SearchControls();
 String []returnedAttributes = {"mail"};
 String filter = "(userName={0})"; // You might want to limit search to user objects only based on objectClass
 String []filterAttributes = {userName};
 String baseDN = "CN=user,DC=company,DC=org"; // Replace this with the real baseDN
 constraints.setReturningAttributes(returnedAttributes)
 constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
 NamingEnumeration<SearchResult> results = authContext.search(baseDN, filter, filterAttributes, constraints);
于 2013-03-06T12:15:37.050 に答える
2

コードにいくつかの問題があります。Active Directoryを使用しているため、uidの使用は機能しません。CNを使用する必要があります。

baseDNは表示されませんが、それが何であるかを知っていますか?「難しい部分」を確認してください

同様に、ldapURL。提案どおりに実行し、既知のLDAPブラウザーを入手して、接続を確立します。Microsoft LIB(またはVB)を使用すると、MSが内部で多くの作業を行うため、LDAP通信が正しく表示されません。私の現在のお気に入り

ADに対して機能することがわかっている他の人のコードを試してください。

于 2013-03-07T11:53:22.863 に答える
1

検索リクエストは、少なくとも次のもので構成されます。

  • その下のエントリが検索結果で返される候補となるベース オブジェクト
  • 検索範囲 ( baseone、またはsub)
  • 検索結果でどの候補が返されるかを決定するフィルター。たとえば、mail=*(現在)、cn=Stack Overflow(等しい)、cn=Stack*(部分文字列)
  • 返す属性のリスト

エントリは返される候補です:

  • それらが検索ベース以下にある場合 (oneベース オブジェクトの直下にあるエントリのみが返され、ベース オブジェクト自体は返されない検索範囲を除く)
  • フィルタ内のアサーションは、エントリ内の属性値と一致します。たとえば、presentフィルタは、前述の検索範囲を除く属性をmail=*持つベース オブジェクト以下のすべてのエントリと一致します。mailone

こちらもご覧ください

于 2013-03-06T12:05:54.153 に答える
1

これに関するオラクルのチュートリアルを確認してください:http://docs.oracle.com/javase/tutorial/jndi/ldap/jndi.html

あなたの例では、最初のパラメーターは検索ベースにする必要があります。これは、ユーザーがディレクトリ内のどこにいるかを意味します。つまり、「ou = people」です。2つ目は検索フィルターです。あなたの例では、おそらくユーザーを照合できる属性です。つまり、"sn="+userName (<- エンコードする必要があります)。

これは取得したい情報であるため、「mail」の値は結果内にある必要があります。

http://docs.oracle.com/javase/1.6/docs/api/javax/naming/directory/DirContext.htmlも参照してください。

LDAP は簡単ではありません。開始するには、いくつかの優れたチュートリアルを見つけてみてください。

于 2013-03-06T12:06:18.837 に答える
1

あなたはこの行で間違っています:

NamingEnumeration results = authContext.search("mail", userName, constraints);

authContext.search の最初の引数はベースであり、サーバーのドメインである必要があります

元:

ou=People,dc=google,dc=com

注: グラフィカルな LDAP ブラウザを使用して、ドメインを把握します。

于 2013-03-06T12:04:22.317 に答える