我需要构建一个具有非常长的 OR 条件的 LDAP 过滤器,并且想知道是否有更好的方法来做到这一点。
目前,我使用的查询字符串是
(|(userid=user1)(userid=user2)(userid=user3)....)
此查询字符串中最多可以有 200 个左右的用户。相关用户不属于任何特定的 LDAP 组,也不具有任何其他共同属性;它们随机分布在整个 LDAP 目录中。我识别我感兴趣的用户的唯一方法是通过他们的用户 ID。我也无法控制 LDAP 服务器,并且无法创建用户组(在这种情况下它也没有多大意义)。
构建这个查询字符串是乏味且容易出错的,我想知道是否有更好的方法来做到这一点。
更多背景信息:完整的LDAP目录非常大,有数万个用户。相关用户已被选中参加培训课程,教室计算机将只允许选定的用户登录。用户列表(以及我的过滤器)每隔几周就会发生变化。
底层实现将是 RedHat 7 上的 openldap。
答案1
#!/usr/bin/env perl
use 5.14.0;
use warnings;
use Net::LDAP::Util qw(escape_filter_value);
# users as arguments or via standard input
chomp(@ARGV = readline *STDIN) unless @ARGV;
print '(|';
for my $user (@ARGV) {
print '(userid=' . escape_filter_value($user) . ')';
}
say ')';
然后像
$ sudo yum -y install perl-LDAP
... yum flails wildly here ...
$ perl whatyoucalledtheabovecode foo bar zot
(|(userid=foo)(userid=bar)(userid=zot))
$