LDAPサーバーからすべてのユーザーを取得し、ベースから検索を実行しようとしています。これが私のコードです。
public LdapTemplate ldapTemplate() {
LdapContextSource ctxSrc = new LdapContextSource();
ctxSrc.setUrl("ldap://127.0.0.1:389/");
ctxSrc.setBase("dc=test,dc=com");
ctxSrc.setUserDn("admin");
ctxSrc.setPassword("password");
ctxSrc.afterPropertiesSet();
LdapTemplate lt = new LdapTemplate(ctxSrc);
return lt;
}
private LdapTemplate ldapTemplate = ldapTemplate();
public List<User> getAllUsers() {
LdapQuery query= query().base("").where("objectclass").is("user");
return ldapTemplate.search(query, new UserAttributesMapper());
}
これはエラーです:
10:07:09.406 [main] DEBUG o.s.l.c.s.AbstractContextSource - AuthenticationSource not set - using default implementation
10:07:09.413 [main] DEBUG o.s.l.c.s.AbstractContextSource - Not using LDAP pooling
10:07:09.416 [main] DEBUG o.s.l.c.s.AbstractContextSource - Trying provider Urls: ldap://127.0.0.1:389/dc=test,dc=com
10:07:09.548 [main] DEBUG o.s.l.c.s.AbstractContextSource - Got Ldap context on server 'ldap://127.0.0.1:389/dc=test,dc=com'
Exception in thread "main" org.springframework.ldap.PartialResultException: Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '/'
at org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:216)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:385)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:309)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:616)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:586)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:1651)
at ldap.example.UserRepositoryImpl.getAllUsers(UserRepositoryImpl.java:81)
at ldap.example.test.LdapApp.main(LdapApp.java:23)
Caused by: javax.naming.PartialResultException: Unprocessed Continuation Reference(s); remaining name '/'
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2914)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2888)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.getNextBatch(AbstractLdapNamingEnumeration.java:148)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMoreImpl(AbstractLdapNamingEnumeration.java:217)
at com.sun.jndi.ldap.AbstractLdapNamingEnumeration.hasMore(AbstractLdapNamingEnumeration.java:189)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:365)
... 6 more
BUILD FAILED (total time: 1 second)
フィルタリングするou
と機能しますが、ルートからフィルタリングする必要があります。
ポートを変更すると役立つという質問のコメントを書きます。ただし、ポートを変更してもこの問題は解決しません。ポート3268
はActiveDirectoryの特別な場所-グローバルカタログを指します。すべてのオブジェクトのセットがありますが、それぞれに属性の小さなサブセットしかありません(たとえば、distinguishedName、cn、sAMAccountName ...)。つまり、より具体的な属性が必要なくなるまで機能します。
問題分析
クエリの結果としてADが参照オブジェクトを返すため、例外が発生します。
[Active Directory](...)フォレストに存在するが、要求を処理するディレクトリサーバーに含まれていないオブジェクトに関するデータを要求するクエリに応答して参照を生成します。これらは、フォレスト内のドメイン、スキーマ、および構成コンテナーを参照するため、内部相互参照と呼ばれます。
また、紹介追跡が無効になっている場合:
場合は、紹介追跡が有効になっていないと、サブツリー検索が実行され、検索は、検索基準を満たす指定したドメイン内のすべてのオブジェクトを返します。検索では、ディレクトリサーバードメインの直接の子孫である従属ドメインへの参照も返されます。クライアントは、紹介によって指定されたパスにバインドし、別のクエリを送信することによって、紹介を解決する必要があります。
紹介追跡を有効にすることはできますが、コストがかかります-アプリケーションの速度が低下します-これについては、ここで読むことができます。そして、ほとんどの場合、それは必要ではないと思います。
解決策1:解決策1:
場合ctxSrc.setBase()
によっては、質問でより具体的なbaseDNメソッドを割り当てるだけで十分な解決策があります。たぶん、すべてのユーザーは内側のパスの中にいます"ou=user,dc=department,dc=test,dc=com"
。
この回答で詳細をお読みください。
解決策2:解決策2:
SpringではLdapTemplate
、メソッドsetIgnorePartialResultException()を使用してこの例外を無視することもできます。
ldapTemplate.setIgnorePartialResultException(true);
この回答で詳細をお読みください。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加