Размещено ldap_search в OpenLDAP, чтобы обойти ограничение размера? - PullRequest
3 голосов
/ 03 декабря 2009

В настоящее время мы находимся в процессе перехода от устаревшей проприетарной службы каталогов к OpenLDAP. Сегодня мы столкнулись с проблемой, что ldap_search_ext_s или ldapsearch вообще не возвращает никаких результатов, если число записей, которые должны были быть возвращены текущим поиском, достигло определенного предела.

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

В документации MSDN я заметил, что есть механизм для выполнения постраничного поиска , который позволил бы мне обойти ограничение размера. Очевидно, это также указано в черновом RFC от 1996 , но еще не завершено (пока)?

В любом случае, поскольку я не работаю над Windows-Box, мне нужно использовать API OpenLDAP, который, кажется, не обеспечивает этот механизм (по крайней мере, я не смог найти его на их странице поиска )

Что подводит меня к моему вопросу: у вас есть идея, что я мог бы сделать, чтобы решить эту проблему элегантным способом?

Спасибо за вашу помощь!

Ответы [ 4 ]

1 голос
/ 20 ноября 2010

OpenLDAP поддерживает постраничный поиск результатов через ldap_create_page_control () и друзей. Здесь - описание и пример кода. Если это не поможет, я могу предоставить выдержки из производственного кода.

1 голос
/ 11 декабря 2014

У меня была проблема с использованием ldap_create_page_control с ldap_search_ext_s, моя реализация библиотеки ldap использовала LDAP версии 2 по умолчанию, и похоже, что она поддерживается для версии 3+. Он возвращал «Не поддерживается» из ldap_search_ext_s () до того, как я установил LDAP на версию 3.

0 голосов
/ 29 декабря 2016

Мне удалось обойти ограничение размера, используя ldap_control_paged_result

ldap_control_paged_result используется для включения нумерации страниц LDAP путем отправки элемента управления нумерацией страниц. Приведенная ниже функция отлично работает в моем случае.

    function retrieves_users($conn)
    {
        $dn        = 'ou=,dc=,dc=';
        $filter    = "(&(objectClass=user)(objectCategory=person)(sn=*))";
        $justthese = array();

        // enable pagination with a page size of 100.
        $pageSize = 100;

        $cookie = '';

        do {
            ldap_control_paged_result($conn, $pageSize, true, $cookie);

            $result  = ldap_search($conn, $dn, $filter, $justthese);
            $entries = ldap_get_entries($conn, $result);

            if(!empty($entries)){
                for ($i = 0; $i < $entries["count"]; $i++) {
                    $data['usersLdap'][] = array(
                            'name' => $entries[$i]["cn"][0],
                            'username' => $entries[$i]["userprincipalname"][0]
                    );
                }
            }
            ldap_control_paged_result_response($conn, $result, $cookie);

        } while($cookie !== null && $cookie != '');

        return $data;
    }
0 голосов
/ 08 декабря 2009

Использовать AD или Novell eDirectory? ;)

...