6

バックグラウンド

認証を処理する 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 環境」の下に正しい値でこれらの変数を表示できます。

AUTHENTICATE_USERNAME
AUTHENTICATE_REALM
AUTHENTICATE_ACCESS

問題

これらの環境変数をphpから取得できません。

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

3 行目は、変数が見つからなかったことを示す bool(false) を出力します。
ただし、「HTTP_HOST」などの別の Apache 環境変数に変更すると機能します。
..そして、はい、私も試しgetenv()ましたが、同じ結果です。

また、Apache サーバーを動作させるには、APR 1.3.0 でコンパイルする必要があることにも注意してください。httpd.apache.org の Apache msi ビルドを使用しましたが、バージョン 2 より上の APR でコンパイルされているようです。それらを見ることができるのでphpinfo()、PHP からアクセスできる必要があります。

4

4 に答える 4

3

.htaccessファイルでこのmod_rewriteルールを使用して、HTTP認証ヘッダー環境変数をで使用できるようにしました$_SERVER['HTTP_AUTHORIZATION']。これはあなたの目的に適応できると確信しています。それが最善の解決策であるかどうかはわかりませんが解決策です。

RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last]
于 2010-11-30T00:19:39.507 に答える
2

私は回避策を作りました、

これはPHPのバグのようです。PHP 4 について報告された関連するバグがいくつか見つかりましたが、まだ修正されていない可能性があります...

私は本当に気に入らない解決策を実行しましたが (Apache ユーザーデータ テーブルにアクセスしているため)、選択の余地がないようです。

//************************************************************* 
// 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 が自動的に使用されます。

誰かがこのトピックに関する最新情報を提供できる場合は、喜んで...

于 2010-11-30T02:23:57.797 に答える
0

最近、環境変数から値を取得し、PHP データ型に解析するためのライブラリを作成しました。このライブラリを使用して、環境変数を PHP データ型に解析したり (integer、float、null、boolean へのキャストなど)、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"));

楽しめ。

于 2015-11-04T20:58:13.140 に答える
0

decezeさんの回答にヒントがあります。彼は $_ENV ではなく $_SERVER からデータを取得しています。

私はApache Env Varを設定していました

メインの httpd.conf で SenEnv MY_VAR が「true」になり、$_ENV でそれを確認できませんでした。しかし、それは $_SERVER にありました。

于 2011-03-01T20:54:20.737 に答える