4

私が持っている唯一のパラメーターがユーザーIDである場合、ユーザーのDN(複数の可能性があります)を取得しようとしています

また、ご覧のとおり、UnboundID LDap SDK を使用しています。

public String getCustomerAdminDN(String uid)
{

    String result =null;
    String filter = "uid=" +uid;
    try {
        SearchResult searchResult = this.ldapConnection.search("",SearchScope.SUB,filter);

        result = searchResult.getMatchedDN();
    } catch (LDAPSearchException e) {
        throw new RuntimeException("Error in the searching query :" + e.getMessage());
    }

  return result;
}

私のuidが次のDNに属しているとしましょう

頭からありがとう

4

1 に答える 1

5

この場合の問題は、「一致した DN」要素が、あなたが思っているものではないということです。検索条件に一致したエントリの DN ではありません (実際には、0、1、または複数のエントリである可能性があります)。操作のターゲットが存在しない場合、応答の一致した DN 要素が提供される場合があります。検索操作で、存在しない検索ベース DN を指定した場合、一致した DN は、サーバーに実際に存在する、指定したものに最も近いエントリの DN を指定する場合があります。たとえば、「ou=nonexistent,dc=example,dc=com」という検索ベース DN を指定した場合、これは存在しませんが、エントリ「dc=example,dc=com」エントリは存在します。 「dc=example,dc=com」の一致した DN 値を返す場合があります。

検索が 1 つ以上のエントリと一致する場合 (上記の例ではそうでなかった検索結果リスナーを使用しない限り)、一致するエントリは getSearchEntries メソッドを介してアクセスできます。例えば:

 List<SearchResultEntry> searchEntries = searchResult.getSearchEntries();
 if (searchEntries.size() != 1)
 {
   // The search didn't match exactly one entry.
 }
 else
 {
   SearchResultEntry entry = searchEntries.get(0);
   result = entry.getDN();
 }

また、値の一部がユーザー入力に由来する可能性がある場合、文字列表現からフィルターを構築する場合は注意が必要です。これにより、ある種のインジェクション攻撃が可能になる可能性があります。LDAP インジェクションは SQL よりも難しく、通常は安全ですが、完全に存在しないわけではありません。したがって、代わりに次のことをお勧めします。

 String filter = "uid=" + uid;

あなたが使う:

 Filter filter = Filter.createEqualityFilter("uid", uid);
于 2012-07-26T17:21:23.903 に答える