Вопрос

Фон

У меня есть Apache / 2.2.15 (Win32) с настройкой PHP / 5.3.2, обработка аутентификации.

<Directory /usr/www/myhost/private>
  # core authentication and mod_auth_basic configuration
  # for mod_authn_dbd
  AuthType Basic
  AuthName "My Server"
  AuthBasicProvider dbd

  # core authorization configuration
  Require valid-user

  # mod_authn_dbd SQL query to authenticate a user
  AuthDBDUserPWQuery "SELECT Password,UserName,Realm,Access FROM authn WHERE user = %s"
</Directory>

Аутентификация работает нормально! Нет проблем.

Но относительно документация, любое дополнительное поле возвращено от authdbduserpwquery, будет введено в Аутентификация_fieldname. переменная в среде.

С phpinfo(), Я вижу эти переменные с помощью правильных ценностей под «apache Environment».

Аутентификация_username.
Аутентификация_realm.
Аутентификация_Access.

Проблема

Я не могу получить эти переменные среды от моего PHP.

1 <?php
2   $Access = apache_getenv('AUTHENTICATE_ACCESS',true);
3   var_dump($Access);
4 ?>

Линия 3 печатает Bool (false), указывающее, что переменная не была найдена!
Однако, если я изменяюсь на другой переменной среды Apache, таких как «http_host», она работает.
... и да, я пробовал getenv() Также, тот же результат.

Также есть отметка, что сервер Apache должен быть скомпилирован с 1.3.3 апр. Я использовал сборку Apache MSI с httpd.apache.org, и, кажется, скомпилирован с APR выше версии 2. Так как я могу их увидеть с phpinfo() Они должны быть доступны от PHP.

Это было полезно?

Решение 2

Я сделал работу вокруг,

Похоже, это может быть ошибка PHP. Нашли некоторые связанные ошибки, сообщили о PHP 4, и, возможно, они еще не исправили их ...

Я сделал решение, которое мне действительно не нравится (потому что я доступаю к таблицу upache userdata), но кажется, что у меня нет выбора.

//************************************************************* 
// If PHP failed to retrieve the AuthDBDUserPWQuery fields.
// Connect to Apache authentication databaseand create the
// envirnment variables manually
//
if (empty($_ENV['AUTHENTICATE_ACCESS'])) {
  $Apache = mysql_connect('MyServerIP','MyUserName','MyPassword',false,MYSQL_CLIENT_SSL|MYSQL_CLIENT_COMPRESS);
  mysql_select_db('MyDatabase',$Apache);
  $SQLSet = mysql_query("SELECT Realm, Access FROM authenticationtable WHERE UserName='".$_SERVER['PHP_AUTH_USER']."' AND Password='".$_SERVER['PHP_AUTH_PW']."'");
  $SQLRow = mysql_fetch_array($SQLSet);
  $_ENV['AUTHENTICATE_REALM'] = $SQLRow['Realm'];
  $_ENV['AUTHENTICATE_ACCESS']= $SQLRow['Access'];
  mysql_close($Apache);
}

Если PHP не удалось обновить $ _ENV правильно, это будет извлекать текущий войти в систему пользователя из той же базы данных и таблицу, которую Apache использует для аутентификации. Затем дополнительные поля будут записаны в глобальную переменную $ _ENV, чтобы ее можно было использовать, как предполагается. Позже, когда фиксированная «ошибка» исправлена, она автоматически использовала оригинал $ _ENV.

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

Другие советы

Я использовал это правило MOD_REWRITE в файле .htaccess, чтобы сделать переменную заголовка HTTP-авторизации доступной в $_SERVER['HTTP_AUTHORIZATION']. Отказ Я уверен, что это может быть адаптировано для ваших целей. Не уверен, это лучшее решение, но это а. решение:

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]

В ответе Окхезе есть подсказка. Он выбирает данные от $ _server вместо $ _env.

Я устанавливал Apache Env var с

Senenv my_var "true" на главном httpd.conf и не мог видеть его в $ _env. Хотя это было в $ _Сервере.

Недавно я написал библиотеку, чтобы получить значения из переменных среды и анализа в виде типов данных PHP. Эта библиотека может использоваться для разбора переменных среды до типов данных PHP (например, отливка для целочисленного, поплавка, нулевых, логических), анализа сложных структур данных, таких как строка JSON, а также вклад вклад в созреемость.

Библиотека доступна здесь: https://github.com/jpcercal/environment.

Настройка вашу среду переменные с помощью .htaccess на примере:

SetEnv YOUR_ENV_VARIABLE_NAME the-value-of-your-env-var

И чтобы получить значения из переменной среды (независимо от окружающей среды CLI, Apache, Nginx, PHP встроенный сервер и многое другое) для этого:

<?php
// ...
require "vendor/autoload.php";
// ...
var_dump(Cekurte\Environment\Environment::get("YOUR_ENV_VARIABLE_NAME"));

Наслаждайся этим.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top