Max*_*and 6 php apache authentication environment-variables getenv
我有一个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>
Run Code Online (Sandbox Code Playgroud)
身份验证工作正常!没问题.
但是对于文档,从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 ?>
Run Code Online (Sandbox Code Playgroud)
第3行打印bool(false),表示找不到变量!
但是,如果我更改为另一个Apache环境变量,例如'HTTP_HOST',它可以工作.
..是的,我也尝试过getenv(),同样的结果.
还有一个注意事项,Apache服务器需要使用APR 1.3.0进行编译才能工作.我使用了来自httpd.apache.org的Apache msi构建,它似乎是用APR编译的,高于版本2.因为我可以看到它们,phpinfo()所以它们必须可以从PHP访问.
我做了一个解决办法,
看起来这可能是一个 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);
}
Run Code Online (Sandbox Code Playgroud)
如果 PHP 未能正确更新 $_ENV,这将从 Apache 用于身份验证的同一数据库和表中检索当前登录的用户。然后额外的字段将被写入全局 $_ENV 变量中,以便可以按预期使用。稍后当“bug”修复后,它将自动使用原来的$_ENV。
如果有人可以提供有关此主题的一些最新信息,我会很高兴......
| 归档时间: |
|
| 查看次数: |
3247 次 |
| 最近记录: |