質問

バックグラウンド

PHP/5.3.2をセットアップし、認証を処理するApache/2.2.15(Win32)があります。

<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から戻ってきた余分なフィールドは authentication_fieldname 環境の変数。

phpinfo(), 、「Apache Environment」の下で彼が正しい値であるこれらの変数を見ることができます。

Authenticate_username
Authenticate_Realm
Authenticate_access

問題

PHPからこれらの環境変数を取得することはできません。

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

行3は、変数が見つからなかったことを示すブール(false)を印刷します!
ただし、「http_host」などの別のApache環境変数に変更すると、動作します。
..そして、はい、私は試しました getenv() また、同じ結果。

また、Apacheサーバーを4月1.3.0でコンパイルする必要があるというメモもあります。 httpd.apache.orgからApache MSIビルドを使用しましたが、バージョン2を上回るAPRでコンパイルされているようです。 phpinfo() PHPからアクセスできる必要があります。

役に立ちましたか?

解決 2

私は回避しました、

これはPHPバグかもしれないようです。 PHP 4に報告されているいくつかの関連バグが見つかりましたが、おそらくそれらはまだ修正していません...

私は本当に好きではないソリューションをしました(Apache 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 Authorizationヘッダー環境変数をで利用できるようにしました $_SERVER['HTTP_AUTHORIZATION']. 。これはあなたの目的のために適応できると確信しています。それが最良の解決策かどうかはわかりませんが、それは a 解決:

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

Decezeの答えには手がかりがあります。彼は$ _ENVの代わりに$ _Serverからデータを取得しています。

私はApache env varを設定していました

senenv my_var "true" in the main httpd.confでは、$ _envで見ることができませんでした。ただし、$ _Serverでした。

最近、環境変数から値を取得し、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