Постоянство сеанса PHP LDAP - PullRequest
       0

Постоянство сеанса PHP LDAP

0 голосов
/ 04 февраля 2019

Я работаю над сайтом на PHP с простой аутентификацией пользователя и CRUD с LDAP.Я установил правила в моей AD, чтобы указать, какие группы могут или не могут редактировать другие группы, а какие атрибуты могут редактировать пользователей.

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

Juste после аутентификации и перед перенаправлением, функция ldap_exop_whoami () возвращает мне DN пользователя.Но после перенаправления он ничего не возвращает.

Я отмечаю еще одно сообщение , что « PHP LDAP не поддерживает постоянные соединения. », и это было только информация об этом, которую я смог найти.

Мне нужно сохранить сеанс пользователя для пользователя CRUD.

Например, если пользователь хочет отредактировать егопароль или его имя, ldap_mod_replace () вернет " Недостаточный доступ ", конечно, потому что без надлежащего сеанса ldap мог попытаться анонимного связывания.

Isэто нормально, что я не могу создать простой пользовательский CRUD из-за такого поведения?

На данный момент я вижу 2 решения, которые не очень безопасны.

  • Первое будетхранить информацию об аутентификации пользователя и привязывать ее на каждой странице.

  • Второй - входить в систему как администратор при каждом обновлении.Это также неправильно по соображениям безопасности и позволяет обойти все настройки AD, касающиеся пользовательских выпусков.

Должен ли я работать с таким поведением?Может быть, я должен использовать библиотеку или что-то?Я немного растерялся, и все мои «решения» не очень хороши, поэтому, если у кого-то есть подсказка или идея, я с удовольствием приму это.

Спасибо.

1 Ответ

0 голосов
/ 05 февраля 2019

Проблема не в 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, чтобы убедиться, что этот механизм поддерживается.

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