Проблема не в LDAP, проблема в HTTP.
HTTP - это протокол без сохранения состояния, тогда как LDAP - это протокол с контролем состояния.
Когда вы делаете HTTP-запрос, ваш PHP-скриптвыполняется и завершается при отправке ответа, который уничтожает то, что было создано в сценарии (так же, как закрывается соединение mysql при завершении сценария PHP).
Разница в том, что в mysql понятиекаждый пользователь использует свои собственные учетные данные для работы базы данных MySQL не используется, вы обычно устанавливаете пользователя базы данных, который действует как пользователь для выполнения операций.
В LDAP вы хотите изменить это поведение, потому что это небезопасный, но ... так было всегда.
Так что, как и в MySQL (например), вам придется использовать что-то вроде singleton, которое инициирует ваше LDAP-соединение в начале каждого PHP-скрипта, когда вам нужноподключиться к серверу LDAP.Для этого, как вы сказали, у вас есть 2 решения:
- Сохраните учетные данные пользователя и используйте их для открытия соединения на каждой странице
- Используйте техническую учетную запись для выполнения запросов
Разница в том, что в реализации LDAP существует механизм, который позволяет технической учетной записи действовать как пользователь.И действуйте как пользователь в том смысле, что изменения будут зачислены пользователю (например, это будет пользователь, на которого будет ссылаться операционный атрибут createdBy
для записи, которую пользователь создаст)
Посмотрите на этот документ, чтобы увидеть, как реализовать это поведение:
http://php.net/manual/en/function.ldap-sasl-bind.php
и
https://www.openldap.org/doc/admin24/sasl.html (Раздел 15.3. SASL Proxy Authorization
)
ПРИМЕЧАНИЕ. Вам потребуется проверить используемую реализацию LDAP, чтобы убедиться, что этот механизм поддерживается.