NET :: LDAP-фильтр с OR - PullRequest
       14

NET :: LDAP-фильтр с OR

3 голосов
/ 30 ноября 2011

В PERL, NET :: LDAP я пытаюсь использовать-

my $psearch-$ldap->search(   
    base => $my_base,
    attr => ["mail","employeeNumber","physicalDeliveryOfficeName"],
    filter => "(&(mail=*)(!(employeeNumber=9*)) (&(physicalDeliveryOfficeName=100)) (|(physicalDeliveryOfficeName=274)))");

Говоря: «Дайте мне всех с почтовой записью, где номер сотрудника не начинается с 9, а имя физического_Доставки - либо 100, либо 274».

Я могу заставить его работать, используя только 100 или только 274, но я не могу понять, как указать 100 или 274.

Я не могу найти правильную строку фильтра, готов вырвать мои волосы ... пожалуйста, помогите !!

1 Ответ

15 голосов
/ 30 ноября 2011

Я не могу проверить это, но запросы LDAP используют нотацию , в то время как мы используем infix нотацию. Представьте, что вам нужно что-то, что собака или кошка . В нотации infix это будет выглядеть примерно так:

((ANIMAL = "cat") OR (ANIMAL = "dog"))

С префиксом логический оператор идет в начало запроса:

(OR (ANIMAL = "cat") (ANIMAL = "dog"))

Преимущество с префиксом обозначения появляется, когда вы делаете более двух проверок на логическое значение. Здесь я ищу что-то вроде кошка , собака или вомбат :

(OR (ANIMAL = "cat") (ANIMAL = "dog") (ANIMAL = "wombat"))

Обратите внимание, что мне нужен был только один логический оператор в начале моего оператора. Это ИЛИ объединит все три утверждения. С нашей стандартной нотацией infix мне понадобится второй оператор ИЛИ :

((ANIMAL = "cat") OR (ANIMAL = "dog") OR (ANIMAL = "wombat"))

Префикс нотация была создана польским математиком Яном Лукасевичем еще в 1924 году в Варшавском университете и стала известна как Польская запись . Позже было обнаружено, что компьютеры могут работать с уравнением спереди назад, если уравнение было записано в записи postfix , которая является обратной польской записи. Таким образом, Реверс Польская запись (или RPN) родился.

Ранние калькуляторы HP использовали нотацию RPN , которая стала вещью Geek Sheik еще в начале 1970-х годов. Представьте себе чувство превосходства над мозгом, которое вы получаете, передавая кому-то свой калькулятор, и они не имеют ни малейшего представления, как его использовать. Единственный способ быть круче тогда - это иметь Curta .

Ладно, хватит ходить по ностальгии. Давайте вернемся к проблеме ...

Самый простой способ построить операцию infix - это построить древовидную диаграмму того, что вы хотите. Таким образом, вы должны набросать ваш запрос LDAP в виде дерева:

                             AND
                            / | \
                           /  |  \
                          /   |   \
                         /    |    \
                        /     |     \
                       /      |      \
                      /       |       \
                    OR  employee!=9*  mail=*
                   /  \
                  /    \
                 /      \
                /        \
               /          \
phyDelOfficeName=100   phyDelOfficeName=274

Чтобы построить запрос на основе этого дерева, начните с нижней части дерева и продвигайтесь вверх по каждому слою. Нижняя часть нашего дерева - это ИЛИ часть нашего запроса:

(OR (physicalDeliveryOfficeName = 100) (physicalDeliveryOfficeName = 274))

Используя оператор LDAP ИЛИ , канал (|) и удаляя лишние пробелы, мы получаем:

(|(physicalDeliveryOfficeName = 100)(physicalDeliveryOfficeName = 274))

Когда я создаю запрос LDAP, мне нравится сохранять каждый раздел как скалярную переменную Perl. Это немного облегчает использование:

$or_part = "|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)";

Обратите внимание, что я пропустил внешнюю пару или скобки. Внешний набор скобок возвращается, когда вы объединяете все запросы вместе. Тем не менее, некоторые люди ставят их в любом случае. Дополнительный набор скобок не повредит запросу LDAP.

Теперь для двух других частей запроса:

$mailAddrExists = "mail=*";
$not_emp_starts_9 = "!(employee=9*)";

И, теперь мы И все три раздела вместе:

"(&($mailAddrExists)($not_emp_starts_9)($or_part))"

Обратите внимание, что один амперсанд сплетает все вместе. Я могу заменить каждый раздел обратно, чтобы увидеть полный запрос:

(&(mail=*)(!(employee=9*))(|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)))

Или вот так:

my $psearch-$ldap->search(   
    base => $my_base,
    attr => ["mail","employeeNumber","physicalDeliveryOfficeName"],
    filter => "(&(mail=*)(!(employee=9*))(|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)))",
);

Или по частям:

my $mail = "mail=*";
my $employee = "!(employee=9*)";
my $physicalAddress = "|(physicalDeliveryOfficeName=100)"
     . "(physicalDeliveryOfficeName=274)";

my $psearch-$ldap->search(   
    base => $my_base,
    attr => ["mail","employeeNumber","physicalDeliveryOfficeName"],
    filter => "(&($mail)($employee)($physicalAddress))",
);

Как я уже говорил, я не могу это проверить. Надеюсь это работает. Если ничего другого, я надеюсь, что вы понимаете, как создать запрос LDAP, и можете понять, как сделать это самостоятельно.

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