从PHP / CakePHP访问REMOTE_USER

时间:2009-05-26 10:28:43

标签: php authentication cakephp

我正在开发一个CakePHP网站,我刚刚使用.htaccess文件启用了VAS身份验证:

AuthType VAS

AuthVasUseBasic On
AuthVasRemoteUserMap local

Require valid-user

我希望能够通过使用$_SERVER['REMOTE_USER']找出登录的用户,但我发现$_SERVER结构中缺少密钥:所有这些都有{{{ 1}}。事实上,整个结构充满了$_SERVER['REDIRECT_REMOTE_USER']前缀:

的键
REDIRECT_

我不确定发生了什么!这是在POST请求中首先生成的,并且它没有对此特定请求进行重定向。

这与CakePHP有关,还是只是一般的PHP问题?有什么想法发生了什么?我现在在互联网上发现了不少页面,这表明REDIRECT_REMOTE_USER是正常/常见的,可以找到这个值,但似乎没有人知道为什么!

2 个答案:

答案 0 :(得分:2)

Apache正在添加那些REDIRECT_前缀,以便脚本可以更好地处理发生的事情。对于我的应用程序,我已经写了一个函数来处理这个问题。在我的例子中,它是一个类的方法,但你可以很容易地把它变成一个全局函数。

class MyClass {
    /** @var integer How deep the redirect layers of Apache go. -1 means not set. */
    private $redirectLevel = -1;

    /**
     * Get an environment variable with all the REDIRECT_ prefixes stripped off
     */
    private function getEnv($var)
    {
        // Find out how deep the redirect goes
        if ($this->redirectLevel == -1) {
            reset($_SERVER);
            $key = key($_SERVER);
            $this->redirectLevel = substr_count($key, 'REDIRECT_');
        }

        $result = '';
        $prefix = '';
        for ($i = 0; $i < $this->redirectLevel + 1; $i++) {
            if (isset($_SERVER[$prefix . $var])) {
                $result = $_SERVER[$prefix . $var];
            }
            $prefix .= 'REDIRECT_';
        }
        return $result;
    }
}

编辑:上面的函数返回REDIRECT_前缀最多的变量的内容,这通常是你想要的。如果Apache不为变量添加前缀,那么这就是你得到的。变量的内容可以根据前缀的数量而改变。毕竟,Apache添加了前缀,因此它不会覆盖旧值。

例如,在我的网站上,我使用mod_ssl通过客户端SSL证书进行客户端身份验证。证书主题(包含用户的电子邮件地址)存储在SSL_CLIENT_S_DN变量中。使用Apache前缀,这将显示为:

$_SERVER['REDIRECT_REDIRECT_SSL_CLIENT_S_DN'] // string containing the subject
$_SERVER['REDIRECT_SSL_CLIENT_S_DN'] // exists, but empty
// $_SERVER['SSL_CLIENT_S_DN'] does not exist

我上面写的getEnv()函数将返回顶部函数。

答案 1 :(得分:1)

这是一般的PHP事情。某些框架根据其路由策略在内部重定向页面。如果您在框架之外重定向,您将获得相同的结果。

直接访问框架之外的页面将为您提供最初预期的名称。 我注意到虽然在CodeIgniter中你得到$_SERVER['REMOTE_USER']并且没有重定向。因此,它取决于您使用的框架。

因此,如果您不确定是否发生重定向,最好检查两者。

我还注意到您正在使用AuthVasUseBasic On。如果您正在使用此功能,还应检查基本用户身份验证变量$_SERVER['USERNAME'] IIRC