带有OR的NET :: LDAP FIlter

Jaz*_*zzy 3 perl ldap filter

在PERL,NET :: LDAP中,我正在尝试使用 -

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

说"给我每个人一个邮件条目,员工编号不以9开头,而physicalDeliveryOfficeName是100或274".

我可以使用100或仅使用274来使用它,但我似乎无法弄清楚如何指定100 OR 274.

我似乎无法找到正确的滤芯,准备拉我的头发...请帮助!!

Dav*_* W. 15

我无法对此进行测试,但LDAP查询使用前缀表示法,而我们习惯使用中表示法.想象一下,如果你想要的东西是.在中表示法中,它看起来像这样:

((ANIMAL = "cat") OR (ANIMAL = "dog"))
Run Code Online (Sandbox Code Playgroud)

使用前缀表示法,布尔运算符位于查询的开头:

(OR (ANIMAL = "cat") (ANIMAL = "dog"))
Run Code Online (Sandbox Code Playgroud)

当每个布尔值执行两次以上的检查时,前缀表示法的优点就出现了.在这里,我正在寻找一种,袋熊的东西:

(OR (ANIMAL = "cat") (ANIMAL = "dog") (ANIMAL = "wombat"))
Run Code Online (Sandbox Code Playgroud)

请注意,我在语句前面只需要一个布尔运算符.这将OR在一起的所有三个语句.使用我们的标准中表示法,我必须有第二个OR运算符:

((ANIMAL = "cat") OR (ANIMAL = "dog") OR (ANIMAL = "wombat"))
Run Code Online (Sandbox Code Playgroud)

前缀表示法是由波兰数学家Jan Lukasiewicz于1924年在华沙大学创建的,因此被称为波兰表示法.后来发现,如果方程式是用后缀表示法编写的,那么计算机可以从前到后运行方程,这与波兰表示法相反.因此,反向波兰表示法(或RPN)诞生了.

早期的HP计算器使用RPN符号,在20世纪70年代早期成为Geek Sheik的东西.想象一下,当您将计算器交给某人并且他们不知道如何使用它时,您会获得大脑优势感.当时冷却的唯一方法就是拥有Curta.

好吧,足够走怀旧车道.让我们回到这个问题......

构造中操作的最简单方法是构建所需内容的树形图.因此,您应该将LDAP查询描绘为树:

                             AND
                            / | \
                           /  |  \
                          /   |   \
                         /    |    \
                        /     |     \
                       /      |      \
                      /       |       \
                    OR  employee!=9*  mail=*
                   /  \
                  /    \
                 /      \
                /        \
               /          \
phyDelOfficeName=100   phyDelOfficeName=274
Run Code Online (Sandbox Code Playgroud)

要基于此树构建查询,请从树的底部开始,然后逐步向上运行.我们树的底部是查询的OR部分:

(OR (physicalDeliveryOfficeName = 100) (physicalDeliveryOfficeName = 274))
Run Code Online (Sandbox Code Playgroud)

使用LDAP的OR运算符,pipe(|)并删除多余的空格,我们得到:

(|(physicalDeliveryOfficeName = 100)(physicalDeliveryOfficeName = 274))
Run Code Online (Sandbox Code Playgroud)

当我构建LDAP查询时,我喜欢将每个部分保存为Perl标量变量.它使它更容易使用:

$or_part = "|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)";
Run Code Online (Sandbox Code Playgroud)

请注意,我已经离开外部对或括号.当您将所有查询串起来时,外部括号集将返回.然而,有些人还是把它们放了.额外的一组括号不会损害LDAP查询.

现在查询的其他两个部分:

$mailAddrExists = "mail=*";
$not_emp_starts_9 = "!(employee=9*)";
Run Code Online (Sandbox Code Playgroud)

而且,现在我们所有三个部分在一起:

"(&($mailAddrExists)($not_emp_starts_9)($or_part))"
Run Code Online (Sandbox Code Playgroud)

请注意,单个&符号将它们编织在一起.我可以替换每个部分以查看完整查询:

(&(mail=*)(!(employee=9*))(|(physicalDeliveryOfficeName=100)(physicalDeliveryOfficeName=274)))
Run Code Online (Sandbox Code Playgroud)

或者像这样:

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

零碎的:

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))",
);
Run Code Online (Sandbox Code Playgroud)

正如我之前所说,我无法测试这一点.我希望它有效.如果不出意外,我希望您了解如何创建LDAP查询,并了解如何自己完成.