Perl Net :: LDAP фильтр не работает - PullRequest
1 голос
/ 14 июня 2011

Я использую perl-ldap для поиска и изменения каталогов LDAP.

Все работает нормально, за исключением случаев, когда я пытаюсь найти группу по ее атрибуту "uniqueMember", значение которого равно dn (например,cn=exuser,ou=people,dc=example,dc=com).

Кажется, что это делает строку фильтра для поиска по члену группы

uniqueMember=cn=exuser,ou=people,dc=example,dc=com

Но это не работает.

Ни один из них не "экранирует"равно в строке, так что результирующая строка при выводе выглядит так, что ее знаки равенства экранированы.И у объекта Net :: LDAP :: Filter нет отличной документации, поэтому я не уверен, как его создать, кроме простой передачи строк фильтра, которые я использовал в первую очередь (что тоже не работает).

Есть предложения?

Я должен добавить, что я уверен, что проблема в том, что поиск не возвращает результаты - результирующий объект поиска имеет 0 счетчиков.

Я могуне показывает точный код, но это что-то вроде этого (были изменены только литералы):

my $filter = "uniqueMember=cn=exuser,ou=people,dc=example,dc=com";

my $result = $ldap->search( base => 'ou=groups,dc=example,dc=com',
                            filter => $filter);
while(my $entry = $result->pop_entry)
{ ....
....
}

Соединение и привязка к серверу LDAP были выполнены в подпрограмме, которая работает.Я уверен в названиях организационных подразделений, а также в формате значений uniqueMember.Для строки $filter я пытался экранировать знаки равенства один раз (\=) и дважды (\\\\=).Я попытался использовать Net::LDAP::Filter->new($filter) - хотя я понимаю, что он принимает строку фильтра, подобную той, что в коде, поэтому это не очень полезно.

Как правильно отформатировать эту строку фильтра

Ответы [ 2 ]

1 голос
/ 06 июля 2012

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

my $filter_str = "uniqueMember=cn=exuser,ou=people,dc=example,dc=com";
my $filter = Net::LDAP::Filter->new( $filter_str );

print $filter->as_string();

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

#my $filter = "uniqueMember=cn=exuser,ou=people,dc=example,dc=com";
my $filter = "uniqueMember=*exuser*";

Кроме того, ваша база указывает наou=groups вместо ou=people как ваш фильтр.Это само по себе может вызывать проблемы, поскольку в «группах» не может быть пользователей с такими атрибутами.

#my $result = $ldap->search( base => 'ou=groups,dc=example,dc=com',
my $result = $ldap->search( base => 'ou=people,dc=example,dc=com',
                        filter => $filter);
while(my $entry = $result->pop_entry)
{ ....
  ....
}
0 голосов
/ 15 июня 2011

Работает ли это с инструментами командной строки LDAP? Похоже, что это проблема с запросом LDAP, а не с Net :: LDAP.

Я не очень хорошо разбираюсь в синтаксисе LDAP, но я думал, что это будет что-то вроде

(&(group=uniqueMember)(cn=exuser)(ou=people)(dc=example)(dc=com))

Вы также можете попробовать настроить фильтр с помощью Net :: LDAP :: Filter и посмотреть, к чему он его анализирует.

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