Intereting Posts
DF (с опциями) оставляет процесс зомби Как монтировать диск при запуске в Ubuntu? Инструмент Диски не работает Использование X-Windows из Windows 8.1 Как указать пакеты RPM, установленные в порядке установки восстановить последнее состояние полного снимка lvm Как выйти из сеанса CSH? Проблема с выходом awk в цикл for Создание загрузочного GPT-раздела EFI с помощью gdisk на предыдущем MBR, поврежденный GPT как ограничить доступ к файловому менеджеру на основе пользователей на Ajenti Извлечение части строк с определенным шаблоном с помощью awk, sed Чтение stdout / stderr из подоболочки в родительский Почему некоторые команды регулярных выражений имеют противоположные интуиции '\' с различными символами? Нужно ли включать CONFIG_USB_OHCI_HCD, когда есть только порты USB 2.0 Как правильно экспортировать и импортировать общие ресурсы NFS, которые также имеют подкаталоги в качестве точек монтирования? Не удалось получить psk из сети с помощью wpa_cli

Замена для php5-auth-pam для аутентификации входа в сайт для локальных пользователей

Я работаю над логином для PHP-сайта, где пользователи должны быть успешно зарегистрированы, если они вводят правильное имя пользователя и пароль для локальной учетной записи в системе. Оглядываясь, кажется, что традиционным способом сделать это было использование модуля PAM PHP .

К сожалению, похоже, что этот модуль устарел, и я больше не могу его установить с помощью apt-get install php5-pam-auth в Ubuntu Server 14.04. Я смог принудительно установить его с помощью pecl install pam , но даже тогда он все еще не работает, потому что для его использования требуется время вызова по ссылке, например:

 if ( pam_auth( $uname, $pswd, &$error ) ) { echo "You are authenticated!" } 

… что приводит к тому, что PHP жалуется на то, что время вызова по ссылке также устарело:

 [Fri Jul 24 01:25:35.788680 2015] [:error] [pid 25328] [client xx.xxx.xx.xx:1179] PHP Fatal error: Call-time pass-by-reference has been removed in /var/www/academies/phptest/login.php on line 7, referer: http://<domain>:81/phptest/ 

Есть ли обновленный или альтернативный способ сделать это? Я нашел этот ответ на аналогичный вопрос, но я не мог скомпилировать код C; это дало мне следующую ошибку:

 pam.c: In function 'authenticate': pam.c:63:9: error: expected declaration or statement at end of input return ( retval == PAM_SUCCESS ? 0:1 ); ^ 

Согласно phpinfo() , я запускаю PHP версию 5.5.9-1ubuntu4.11 .

Я не согласен с решением обесценить php-auth-pam, хотя я могу понять, почему они это сделали. Существует ряд проблем для интеграции php и pam, в том числе php, часто связанный с вашим веб-сервером, который может быть или не быть многопоточным (и обработка нескольких потоков с помощью pam может быть проблематичной), php имеет тенденцию иметь очень высокий коэффициент попадания (где pam принимает низкий коэффициент попадания), а решения php pam недостаточно масштабируются (хотя они могут быть полезны в некоторых приложениях.

С этим изменением в основном возникают три класса решений. По крайней мере, рекомендуется:

  1. написать свой собственный.
  2. используйте вспомогательный процесс.
  3. обходной пам.

У вас есть все проблемы, о которых я уже говорил, без опыта, накопленного до сих пор. Вспомогательный процесс отделяет pam и php от отдельных процессов, что снижает многие проблемы на управляемых уровнях, но добавляет IPC. Наиболее распространенным решением является проверка подлинности как php, так и операционной системы в отношении одной базы данных, такой как ldap или база данных sql, такая как mysql или postgres. Модули легко доступны для этого.

Единственное другое решение состоит в том, чтобы не аутентифицироваться на php, а на сервере (для apache доступны модули pam auth) или другой метод (cgi, а mod_perl может выполнять проверку подлинности с использованием pam, но передача сеанса назад и вперед интересна, по меньшей мере, как минимум. )

В вашем случае я бы рекомендовал вспомогательный процесс. (apache имеет простой способ сделать это, не вовлекая php.)