LDAPフィルターの簡素化

LDAPフィルターの簡素化

非常に長い 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))
$ 

関連情報