Как создать поисковый фильтр для поискового API java ldap, когда имя объекта содержит одинарные или двойные кавычки - PullRequest
0 голосов
/ 27 июля 2011

У меня есть объект, cn=abc"and'def в каталоге. Я использую API поиска Java:

public LDAPSearchResults search(java.lang.String base,
    int scope,
    java.lang.String filter,
    java.lang.String[] attrs,
    boolean typesOnly,
    LDAPSearchConstraints cons)
    throws LDAPException

Я попытался задать фильтр поиска как abc"and'def, а также как abc\"and\'def. Оба возвращаются:

Неверный поисковый фильтр

Пожалуйста, помогите мне с тем, как построить поисковый фильтр, когда имя объекта содержит одинарные или двойные кавычки.

Ответы [ 3 ]

4 голосов
/ 27 июля 2011

Весь фильтр поиска LDAP должен быть допустимой UTF-8 строкой.Существует пять (5) значений, которые, если они появляются в поисковом фильтре, должны быть экранированы с использованием обратной косой черты \ и двухзначного шестнадцатеричного кода для экранируемого символа.Значения, которые должны быть экранированы: *, (, ), \ и нулевой байт 0;поэтому " и ' являются допустимыми и действительными символами в поисковом фильтре.В языке, подобном Java, который содержит строковый литерал между " символами, символ ", являющийся частью строкового литерала, должен быть экранирован.

В одном примере вы перечисляете фильтр с обратной косой чертой \ символ в фильтре.Обратная косая черта должна быть экранирована в фильтре с использованием обратной косой черты и шестнадцатеричного кода для обратной косой черты, например, "(cn=abc\5c\"and'def)'".В другом примере вы указываете в качестве фильтра "(cn=abc"and'def)", который на самом деле является допустимым поисковым фильтром - игнорируя тот факт, что внутренний " не экранирован, как это должно быть для компиляции.

В порядкеНапример, я создал объект в каталоге на локальном хосте, прослушивающем порт 1389 с префиксом или контекстом именования dc=example,dc=com, используя следующий LDIF:

dn: cn=abc"and'def,dc=example,dc=com
objectClass: top
objectClass: person
cn: abc"and'def
sn: whatever

Я написал класс Java для поиска записи, бросаяошибка подтверждения, если она не должна быть найдена:

import com.unboundid.ldap.sdk.Filter;
import com.unboundid.ldap.sdk.LDAPConnection;
import com.unboundid.ldap.sdk.LDAPException;
import com.unboundid.ldap.sdk.SearchScope;
import com.unboundid.ldap.sdk.SearchResult;

public final class BSFilter {
  public static void main(String... args) {
    try {
      Filter searchFilter =
        Filter.create("cn=abc\"and'def");
      LDAPConnection connection =
        new LDAPConnection("localhost",1389);
      SearchResult searchResult =
        connection.search("dc=example,dc=com",SearchScope.ONE,
                          searchFilter,"1.1");
      assert(searchResult.getSearchEntries().size() == 0);
    } catch(LDAPException lex) {
      lex.printStackTrace();
      return;
    }
  }
}

Этот класс компилирует и выдает ошибку подтверждения, как и ожидалось, поскольку запись, для которой он ищет, действительно существует.См. RFC 4515 для получения информации о поисковом фильтре.Используемый LDAPSDK - это превосходный SDK от UnboundID.Обратите внимание, что символ " экранирован в фильтре, так что класс будет компилироваться, но это не имеет никакого отношения к самому тексту фильтра.

2 голосов
/ 27 июля 2011

Используйте силу фильтра, чтобы справиться с побегом.Что-то вроде:

"(&(objectClass=user)(cn={0}))"
1 голос
/ 27 июля 2011

Я использую JNDI и одну из перегрузок search () , которые принимают аргумент `filterArgs '. Все ли побеги требуются для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...