Что такое код ldap_parse_reference

ldap_parse_reference function

The ldap_parse_reference function returns a list of subordinate referrals in a search response message.



The session handle.

A pointer to an LDAPMessage structure containing the search response.

A pointer to the list of subordinate referrals. Free with ldap_value_free.

Return Value

If the function succeeds, the return value is LDAP_SUCCESS.

If the function fails, it returns an error code. See Return Values for more information.


The ldap_parse_reference function returns a list of referrals in the form of URLs. Call this function if a call to ldap_parse_result indicates that there are referrals.

When it is no longer needed, free the Referrals pointer by calling ldap_value_free.


Учебник РНР
Назад Вперёд

ldap_parse_reference — извлекает информацию из вхождения ссылки.


bool ldap_parse_reference (resource link, resource entry, array referrals)

Эта функция в настоящее время ещё не задокументирована; имеется только список аргументов.


Lightweight Directory Access Protocol

LDAP Result Code Reference: The Elements of an LDAP Operation Response Message

The final response message for an operation will always include a result code to indicate whether the operation was successful or to indicate a general reason for the failure. However, there can also be a number of additional elements in the response message. They are described here.

Diagnostic Message

The diagnostic message is an optional string that can provide additional information about the processing that was performed. It’s often used to provide the reason that an operation failed, but it may also be present in successful responses if there’s information that would be useful to convey back to the client (for example, if a user’s password is about to expire, the response to a successful bind might have a diagnostic message with information about how long until the expiration).

The diagnostic message doesn’t have a set format. In most directory servers, it’s free-form text, so it’s generally not a good idea to try to parse it to see if you can glean any additional information from it. Unless you know that you’re dealing with a server that does have some structured information you can extract from this message, it’s best to just display the message to the end user or record it in the application’s log so that it’s readily available when troubleshooting problems.

You shouldn’t depend on the presence of a diagnostic message, even in a failure response. Some servers just don’t seem to think they’re very useful and may not include them in responses. In other cases, a diagnostic message may be intentionally omitted for security reasons (for example, a bind failure response may not want to provide a potential malicious client with information that could help improve the attack). In some directory servers, this kind of sensitive information is only recorded in a server-side log file so that it’s available to administrators but not to the end client.

Matched DN

The matched DN is an optional distinguished name that may be included in the response to a request targeting an entry that does not exist. Most of the time, it will be included in a response with a noSuchObject (32) result code, but it can be used in conjunction with other result codes as well, like aliasProblem (33), invalidDNSyntax (34), and aliasDereferencingProblem (36).

Most of the time, the matched DN is used to specify the closest ancestor to the provided DN that does exist in the DIT. For example, consider a directory with the following contents:


        u > If a modify request targets entry u >

      In the event that the problem isn’t with a DN provided in the request, but rather with an alias encountered while processing the request (for example, if an alias references an entry that does not exist), then the aliased entry DN may be used to construct the matched DN rather than the DN included in the request.

      The matched DN can also be used in the event that the client prov >

      The matched DN component of a response may be subject to access control restrictions. If a client doesn’t have permission to access the entry that would have been selected as the matched DN value, then the server may use the DN of the first ancestor that the client does have permission to access, or it may omit the matched DN from the response. This is important to ensure that the server does not leak information about the contents of the directory to unauthorized clients.

      Referral URIs

      The referral URIs component of a response is an optional list of one or more URIs that the client may use to re-try the operation somewhere else. That “somewhere else” may be another directory server, or it may be another location in the DIT. For example, if a read-only server receives a request to update some of the information that it contains, it might use the referral URIs component of the response to point the client at the server(s) that accept write operations. Alternately, if the DIT contains a “smart referral” entry (that is, an entry with the referral object class), an operation targeting an entry at or below that smart referral entry would receive a referral response redirecting the client to whatever location is indicated by that entry’s ref attribute.

      These URIs will generally be in the form of LDAP URLs (as described in RFC 4516), but RFC 4511 section 4.1.10 does indicate that the response may include other types of URIs and that clients may ignore URIs that they cannot interpret. In the event that a response includes multiple URIs, the client should assume that any of them can be used in the course of re-trying the operation.

      The referral URIs element should only be present in an LDAP response that has a result code of referral (10). See the discussion of that result code for more information on how referrals should be handled.

      Server SASL Credentials

      The server SASL credentials component will only be included in the response to a bind request that uses the Simple Authentication and Security Layer (SASL) as described in RFC 4422, and only in cases in which the server needs to return information to the client for use while performing the authentication.

      For example, there are a number of challenge-response authentication mechanisms (CRAM-MD5, DIGEST-MD5, SCRAM-SHA-256, etc.) in which the server generates a random challenge string that it needs to send to the client for use in the authentication process. The server SASL credentials element of the bind response can be used to provide this. Similarly, some SASL mechanisms provide a quality of protection (QoP) capability that can be used to protect the subsequent communication between the client and the server after the authentication has completed. And in those cases, the client and server will likely need to perform some kind of negotiation to decide on the parameters for that protection, and whenever the server needs to return data to the client for use in that negotiation, it will go in the server SASL credentials element.

      Not all SASL mechanisms make use of the server SASL credentials element of the bind response, and of the mechanisms that do, not all bind responses will include server SASL credentials.

      Extended Response OID

      The extended response OID component will only be included in the response to an extended request. All extended requests must contain an OID to identify the type of operation that the client wants to process, and responses may optionally include an OID to help the client identify the type of response.

      In some cases, a response OID may be used if a single type of request can yield multiple types of responses, because it allows the client to easily determine which type of response has been returned. If a single type of request can only return one type of response, then the response OID may be omitted, but it’s not prohibited, and it may be nice to include a response OID to make it easier to make sense of a response if the message is viewed in isolation. It is acceptable for the response OID to be the same as or different from a request OID.

      Extended Response Value

      The extended response value component will only be included in the response to an extended request. It is optional, and will generally only be present in cases where the server has information that it needs to return to the client that doesn’t fit in any of the other components of the response.

      For example, the password modify extended request can be used to allow users to change their own passwords, or to allow administrators to reset the passwords for other users. The request can specify the new password that should be set for the user, and in that case, the extended response doesn’t need to have a value. But if the request omits the new password, the server can generate a new password for the target user, and in that case, the extended response will have a value that provides the generated password to the client.

      Response Controls

      Every LDAP message can optionally include one or more controls that provide additional information for use in conjunction with the rest of the message. If a request message includes a control, then it will generally be used to ask the server to do something special when processing the request. For example, if the client includes a server-side sort request control in a search request message, then it means that it wants the server to return the matching entries in some sorted order. And if a response message includes a control, then it is generally used to provide additional information to the client that doesn’t fit in any other component of the response. For example, if a user’s password is about to expire, then a bind response message might include a control that tells the client how much time is left before the password expires.

      Каков правильный способ освобождения памяти от вызова ldap_parse_reference?

      Документация для ldap_parse_reference говорит, чтобы освободить ссылки с помощью вызова ldap_value_free (см. http://linux.die.net/man/3/ldap_parse_reference для справочной страницы.) Однако процедура ldap_value_free устарела.

      Любые указатели на правильный способ сделать это? (Обратите внимание, что я посмотрел на openldap-код и увидел, что какой-то код использует ber_memvfree, но мне это не показалось правильным. Мне не нравилось смешивание вызовов, и документы не говорили, чтобы сделать это таким образом.)

      Создан 04 авг. 13 2013-08-04 18:31:56 No One in Particular

      2 ответа

      Я пошел и посмотрел на код openLDAP. В файле clients/tools/ldapsearch.c процедура print_reference выполняет вызов ldap_parse_reference. Полученные ссылки освобождаются (после печати) вызовом ber_memvfree ((void **) refs).

      Я могу только предположить, что это правильный способ освободить память.

      Создан 07 авг. 13 2013-08-07 10:39:17 No One in Particular

      ldap_value_free() , как говорится в названной вами странице человека. Где в man page for ldap_value_free() говорится, что это устарело?

      Создан 05 авг. 13 2013-08-05 00:50:02 EJP

      Это устарело в источнике (см. Http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob;f=include/ldap.h;h=673dcc3e5d823603701d6fc806a5cd7bac9ba035;hb = ГОЛОВКА # l1835). Он ссылается на функцию 'ldap_value_free_len()' в качестве альтернативы. – Ben 05 авг. 13 2013-08-05 02:55:06

      @Ben Это, конечно же, не устарело на собственной странице руководства, а также на ldap_parse_reference(). – EJP 05 авг. 13 2013-08-05 07:33:51

      Ссылка Бена ясно показывает, что прототип доступен только тогда, когда LDAP_DEPRECATED определен и отличен от нуля. – No One in Particular 05 авг. 13 2013-08-05 10:25:07

      @Ben - страница man для ldap_value_free_len имеет в качестве параметра struct berval **. Однако у меня есть только символ **. Кажется, это не соответствует ситуации. – No One in Particular 05 авг. 13 2013-08-05 10:27:56

      Что такое код ldap_parse_reference

      The ldap_parse_reference function returns a list of subordinate referrals in a search response message.



      The session handle.

      A pointer to an LDAPMessage structure containing the search response.

      A pointer to the list of subordinate referrals. Free with ldap_value_free.

      Return value

      If the function succeeds, the return value is LDAP_SUCCESS.

      If the function fails, it returns an error code. See Return Values for more information.


      The ldap_parse_reference function returns a list of referrals in the form of URLs. Call this function if a call to ldap_parse_result indicates that there are referrals.

      When it is no longer needed, free the Referrals pointer by calling ldap_value_free.


      Minimum supported client

      Minimum supported server

      Windows Server 2008

Unicode and ANSI names

ldap_parse_referenceW (Unicode) and ldap_parse_referenceA (ANSI)

Что надлежащий путь к свободной памяти от требования ldap_parse_reference?

В документации для ldap_parse_reference говорится, чтобы освободить ссылки с требованием к ldap_value_free (см. http://linux.die.net/man/3/ldap_parse_reference для страницы справочника.) Однако установленный порядок ldap_value_free удерживается от использования.

Какие-либо указатели на надлежащий способ сделать это? (Обратите внимание, что я посмотрел на код openldap и видел, что часть кода использовала ber_memvfree, но это не казалось правильным мне. Мне не нравилось смешивание требований, и доктора не сказали, чтобы сделать это тот путь.)

ldap_parse_reference function

The ldap_parse_reference function returns a list of subordinate referrals in a search response message.



The session handle.

A pointer to an LDAPMessage structure containing the search response.

A pointer to the list of subordinate referrals. Free with ldap_value_free.

Return Value

If the function succeeds, the return value is LDAP_SUCCESS.

If the function fails, it returns an error code. See Return Values for more information.


The ldap_parse_reference function returns a list of referrals in the form of URLs. Call this function if a call to ldap_parse_result indicates that there are referrals.

When it is no longer needed, free the Referrals pointer by calling ldap_value_free.


Периодические заметки о программировании

четверг, 31 октября 2013 г.

Что такое LDAP и с чем его едят

Эта статья - кратчайшее введение в LDAP и службы каталогов. Для иллюстрации излагаемого материала я буду пользоваться инструментом Softerra LDAP Browser, который можно свободно скачать с сайта производителя.

Концепцию служб каталогов и требования к их реализации определяет серия стандартов X.500 ITU-T. Здесь каталог - это специализированная база данных, оптимизированная для поиска и извлечения информации, также поддерживающая добавление и изменение данных.

Среди реализаций служб каталогов наиболее известные - OpenLDAP и MS Active Directory. Клиентами каталогов являются адресные книги почтовых клиентов, сетевые службы, такие как DNS, SMTP, корпоративные приложения и информационные системы.

Как правило, служба каталогов

  • реализует протокол для взаимодействия с клиентами,
  • поддерживает разграничение доступа,
  • поддерживает репликацию каталогов,
  • не поддерживает механизм транзакций.

Для взаимодействия со службами каталогов X.500 широко используется протокол LDAP (Lightweight Directory Access Protocol), специфицированный в RFC4510. LDAP работает поверх TCP/IP и является легковесной альтернативой протокола DAP (Directory Access Protocol), весьма требовательного к вычислительным ресурсам.

LDAP реализует протокол взаимодействия со службой каталогов и задает модель данных, соответствующую X.500. Эта модель данных такова:

  • В каталоге хранятся записи (entry).
  • Запись - это коллекция атрибутов (attribute), имеющая уникальное имя (Distinguished Name, DN).
  • Каждый атрибут имеет тип (type) и одно или несколько значений. Синтаксис значений зависит от типа.
  • Атрибут objectClass позволяет контролировать, какие атрибуты обязательны и какие допустимы в записи. Таким образом, записи, как и атрибуты, имеют тип (object class).
  • Записи в каталоге организованы иерархически в виде дерева.
  • Определения типов записей (object classes) и типов атрибутов сами являются записями в каталоге, в специальном поддереве, известном как schema.

Запустим Softerra LDAP Browser и откроем одну из публичных служб каталогов, параметры соединения с которыми предустановлены по умолчанию. (Настроив соединение с MS Active Directory или OpenLDAP в вашей корпоративной сети, вы можете исследовать структуру и содержимое корпоративного каталога.)

Иерархическая организация данных в каталоге часто отражает географическую или организационную структуру. Записи на верхнем уровне могут представлять страны, на нижних - области стран и организации, еще ниже - отделы внутри организаций, людей, оборудование, ресурсы. А можно построить дерево по доменным именам Internet.

Текущая выбранная запись в каталоге Carnegie Mellon University (см. картинку выше) имеет уникальное имя DN o=CMRI,o=CMU,dc=cmu,dc=edu . Компоненты DN - имена узлов иерархической структуры от корневого до текущего (справа налево). Самый левый компонент DN называется относительным уникальным именем (Relative Distinguished Name, RDN). Таким образом, DN o=CMRI,o=CMU,dc=cmu,dc=edu состоит из RDN o=CMRI и DN родительской записи o=CMU,dc=cmu,dc=edu .

Можно рассматривать DN как абсолютный путь к файлу (по аналогии с файловой системой) или как первичный ключ записи в таблице (по аналогии с реляционной БД).

В рассматриваемом DN o=CMRI,o=CMU,dc=cmu,dc=edu два верхних уровня названы по доменным именам Internet. А уровнем ниже текущей записи располагаются записи, идентифицируемые значением атрибута ou (см. картинку выше). Здесь имена атрибутов, идентифицирующие записи разных уровней, имеют следующие значения:

dc аббревиатура от domain component o аббревиатура от organization ou аббревиатура от organizational unit

Эти имена, как и десятки других, - имена стандартных атрибутов, специфицированных в RFC 2256 и предназначенных для использования в объектных классах, описывающих людей, организации, их подразделения и т.п. Все реализациии LDAP поддерживают эти стандартные типы атрибутов. Вот еще несколько примеров: telephoneNumber , name , givenName , postalAddress , sn (аббревиатура от surname).

В рассматриваемой записи с DN o=CMRI,o=CMU,dc=cmu,dc=edu имеются три атрибута, objectClass , o и businessCategory , по каждому из которых можно искать эту запись в каталоге.

Для поиска записей в LDAP-каталоге задаются три компонента:

base DN (базовое уникальное имя) показывает, откуда в иерархии начать поиск scope (область поиска) показывает область поиска, одно из:

  • одна запись, идентифицированная base DN
  • записи уровнем ниже base DN, т.е. дочерние, но не внучатые
  • поддерево с корнем base DN, включая корень

filter (фильтр) задает условие отбора записей

Например, поиск по условию

вернет все записи из поддерева с корнем o=CMU,dc=cmu,dc=edu , удовлетворяющие фильтру (синтаксис фильтра в этом примере легко читаемый, но неправильный, см. далее).

На заметку: cуществуют специальные базовые DN для запроса информации о возможностях сервера, для доступа к схеме (schema) и данным мониторинга.

В Softerra LDAP Browser по Ctrl+F3 вызывается окно поиска, в котором удобно экспериментировать с параметрами поиска LDAP:

В фильтре можно использовать следующие проверки для атрибутов (атрибут ou взят для примера):

Заметьте, что отсутствуют проверки > и . Проверка на приближенное равенство

= использует фонетические сравнение. Расширенная проверка для сравнения образца со значением атрибута использует реализованное LDAP-сервером правило, идентификатор которого указан после двоеточия. Примеры выражений для проверки наличия подстроки (звездочка означает 0 или более символов):

Проверки в фильтре можно комбинировать при помощи логических операторов:

Внимание! Последний фильтр с NOT вернет также записи, не содержащие атрибута cn .

Формируя запрос, можно указать типы атрибутов, которые должны быть включены сервером каталога в ответ. Если список типов атрибутов пуст, то окно поиска LDAP Browser отображает идентифицирующие атрибуты найденных записей (это RDN) и DN родительских записей - вместе они образуют DN найденных записей. Поиск LDAP всегда возвращает DN найденных записей, помимо и независимо от списка атрибутов. Зададим явно список атрибутов, которые мы хотим видеть и повторим запрос (несуществующие типы атрибутов в списке игнорируются сервером и не приводят к ошибке):

Чтобы хорошо освоить синтаксис фильтра, попробуйте разные проверки и их логические комбинации.

Как уже упоминалось, служба каталогов позволяет не только извлекать, но также добавлять и модифицировать записи. Softerra LDAP Browser поддерживает только просмотр данных в каталоге, поэтому для внесения изменений в каталог необходим другой инструмент (например, платный Softerra LDAP Administrator).

Для работы с LDAP практически из любого языка программирования можно воспользоваться существующими библиотекми для этого языка. В будущих статьях, посвященных LDAP, я рассмотрю работу с MS Active Directory в Oracle PL/SQL и в языке программирования Python.

XLIX. Функции LDAP

LDAP это Lightweight Directory Access Protocol - протокол, используемый для доступа к "Directory Servers". Directory это особый вид базы данных, которая содержит информацию как древовидную структуру.

Концепция аналогична структуре директорий жёсткого диска, но в данном контексте root/корневая директория это "The world/Земной шар", а первый уровень поддиректорий это "countries/страны". Ещё ниже идут уровни структуры директорий, содержащие вхождения для companies/компаний, organisations/организаций или мест, а ещё ниже находятся вхождения директорий для people/людей и, возможно, оборудования или документов.

Чтобы обратиться к файлу в поддиректории на жёстком диске, вы вводите что-нибудь вроде

Слэш отделяет каждое подразделение ссылки, а последовательность читается слева направо.

Эквивалентом для полной квалифицированной ссылки на файл в LDAP является "distinguished name/различительное имя", называемое просто "dn". Примером dn может быть:

cn=John Smith,ou=Accounts,o=My Company,c=US

Запятая работает как слэш, а последовательность читается справа налево. Вы можете прочитать это dn как .

country = US
organization = My Company
organizationalUnit = Accounts
commonName = John Smith

Точно так же, поскольку нет твёрдых правил организации структуры директорий на жёстком диске, directory server manager (менеждер сервера директорий) может настроить любую структуру, необходимую для осуществления поставленных задач. Однако есть некоторые соглашения, которые при этом используются: вы не можете записать код для доступа к серверу директорий, если не знаете его структуру, хотя можете использовать БД без знания того, что доступно.

Запрашиваем информацию для всех вхождений, где фамилия начинается с "S", с сервера директорий и отображаем их с именем и email-адресом.

Пример 1. Пример поиска LDAP

Вам нужно получить и скомпилировать клиентские библиотеки LDAP из пакета ldap-3.3 University of Michigan или Netscape Directory SDK 3.0. Вам нужно также перекомпилировать PHP с включённой поддержкой LDAP, прежде чем вызовы PHP к LDAP заработают.

Прежде чем начать использование вызовов LDAP, вам необходимо знать:

Имя или адрес сервера директорий, который вы будете использовать

"base dn" сервера (часть world-директории, которая содержится на этом сервере, которая может быть "o=My Company,c=US")

Нужен ли вам пароль для доступа к этому серверу (многие серверы предоставляют доступ для чтения для "anonymous bind", но требуют пароля для других действий)

Типичная последовательность вызова LDAP в вашем приложении будет соответствовать такому патэрну:

ldap_connect() // установить соединение с сервером
ldap_bind() // anonymous/анонимный или аутентифицированный "login"
сделать что-нибудь типа поиска или обновления директории
и вывести результаты
ldap_close() // "logout"

Большое количество информации о LDAP можно найти на:

Netscape SDK содержит хороший Programmer's Guide в формате .html.

Перечислить всех пользователей в LDAP с помощью PHP

12 Bart [2009-09-24 20:25:00]

Я хотел бы создать php script, который работает как ежедневный cron. То, что я хотел бы сделать, - перечислить всех пользователей в Active Directory, извлечь определенные поля из каждой записи и использовать эту информацию для обновления полей в базе данных MySQL.

В основном, что я хочу сделать, это синхронизация определенной пользовательской информации между Active Directory и таблицей MySQL.

Проблема заключается в том, что sizelimit на сервере Active Directory часто устанавливается в 1000 записей на результат поиска. Я надеялся, что функция php "ldap_next_entry" обойдется вокруг этого, только выбирая одну запись за раз, но прежде чем вы сможете вызвать "ldap_next_entry", вам сначала нужно вызвать "ldap_search", который может вызвать превышение ошибки в SizeLimit.

Есть ли способ помимо удаления sizelimit с сервера? Могу ли я как-то получить "страницы" результатов?

BTW - В настоящее время я не использую сторонние библиотеки или код. Просто методы PHP ldap. Хотя, я, конечно, открыт для использования библиотеки, если это поможет.

php active-directory ldap

5 ответов

15 Решение Stefan Gehrig [2009-09-25 12:15:00]

Я был поражен той же проблемой при разработке Zend_Ldap для Zend Framework. Я попытаюсь объяснить, какова реальная проблема, но чтобы сделать ее коротким: до PHP 5.4, невозможно было использовать выгружаемые результаты из Active Directory с неподдерживаемой версией PHP ( ext/ldap ) из-за ограничения именно в этом расширении.

Попробуй разобраться во всем этом. Microsoft Active Directory использует так называемый серверный элемент управления для выполнения поискового вызова на стороне сервера. Этот элемент управления описан в RFC 2696 "Расширение LDAP-управления для простого манипулирования с помощью постраничных результатов" .

ext/php предлагает доступ к управляющим расширениям LDAP через ldap_set_option() и LDAP_OPT_SERVER_CONTROLS и LDAP_OPT_CLIENT_CONTROLS соответственно. Чтобы установить paged-элемент управления, вам нужен элемент управления-oid, который равен 1.2.840.113556.1.4.319 , и нам нужно знать, как кодировать контрольное значение (это описано в RFC). Значение представляет собой строку октета, обертывающую BER-кодированную версию следующей SEQUENCE (скопированной из RFC):

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

Это позволяет нам отправлять постраничный запрос на сервер LDAP/AD. Но как мы узнаем, есть ли больше страниц, и как мы укажем, с какой контрольной стоимостью мы должны отправить наш следующий запрос?

Здесь мы застреваем. Сервер отвечает набором результатов, который включает в себя необходимую информацию поискового вызова, но PHP не имеет метода для получения именно этой информации из набора результатов. PHP предоставляет оболочку для функции API LDAP ldap_parse_result() , но требуемый последний параметр serverctrlsp не подвергается функции PHP, поэтому там это не способ получить требуемую информацию. A отчет об ошибке был подан для этой проблемы, но с 2005 года ответа не было. Если функция ldap_parse_result() предоставила требуемый параметр, используя постраничные результаты будут работать как

Как вы видите, существует одна строка кода (*) , которая делает все это бесполезным. На моем пути, хотя и редкая информация по этому вопросу, я нашел патч против PHP 4.3.10 ext/ldap от Iñaki Arenaza, но я тоже не пробовал, и не знаю, можно ли применить патч к PHP5 ext/ldap . Патч расширяет ldap_parse_result() , чтобы показать 7-й параметр для PHP:

Фактически единственным оставшимся вариантом будет изменение конфигурации Active Directory и повышение максимального предела результата. Соответствующая опция называется MaxPageSize и может быть изменена с помощью ntdsutil.exe - см. "Как просмотреть и установить политику LDAP в Active Directory с помощью Ntdsutil.exe" .

EDIT (ссылка на COM):

Или вы можете пойти наоборот и использовать COM-подход через ADODB, как предлагается в ссылка, предоставляемая eykanal.

Илон Маск рекомендует:  Семантика в HTML5
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL