簡體   English   中英

從PHP / CakePHP訪問REMOTE_USER

[英]Accessing REMOTE_USER from PHP/CakePHP

我正在開發一個CakePHP網站,為此我剛剛使用.htaccess文件啟用了VAS身份驗證:

AuthType VAS

AuthVasUseBasic On
AuthVasRemoteUserMap local

Require valid-user

我希望能夠找到使用$_SERVER['REMOTE_USER']登錄的用戶,但是我發現$_SERVER結構中缺少該鍵:僅有的就是$_SERVER['REDIRECT_REMOTE_USER'] 實際上,整個結構充滿了帶有REDIRECT_前綴的鍵:

echo var_dump($_SERVER);
array(52) {
["REDIRECT_REDIRECT_REDIRECT_SCRIPT_URL"]=>  string(37) "/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_REDIRECT_SCRIPT_URI"]=>  string(55) "http://test/cake_1_2/feedbacks/edit/6"
["REDIRECT_REDIRECT_REDIRECT_STATUS"]=>  string(3) "200" 
["REDIRECT_REDIRECT_SCRIPT_URL"]=>  string(37) "/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_SCRIPT_URI"]=>  string(55) "http://test/cake_1_2/feedbacks/edit/6" 
["REDIRECT_REDIRECT_STATUS"]=>  string(3) "200" 
["REDIRECT_SCRIPT_URL"]=>  string(37) "/cake_1_2/feedbacks/edit/6" 
["REDIRECT_SCRIPT_URI"]=>  string(55) "http://test/cake_1_2/feedbacks/edit/6" 
["REDIRECT_HANDLER"]=>  string(8) "php5-cgi"
["REDIRECT_STATUS"]=>  string(3) "200" 
["SCRIPT_URL"]=>  string(37) ...
["REDIRECT_REMOTE_USER"]=>  string(9) "andygeers"
... 
}

我不確定是怎么回事! 這是在POST請求中首先生成的,它並未對此特定請求進行重定向。

這與CakePHP有關,還是僅與一般的PHP問題有關? 有什么想法嗎? 我現在在互聯網上發現了很多頁面,這些頁面表明REDIRECT_REMOTE_USER是正常/常見的查找此值的地方,但似乎沒人知道為什么!

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()函數將返回前一個。

這是一般的PHP事情。 一些框架根據其路由策略在內部重定向頁面。 如果您重定向到框架之外,則會得到相同的結果。

直接訪問框架外部的頁面將為您提供最初期望的名稱。 我確實注意到,雖然在CodeIgniter中您獲得了$_SERVER['REMOTE_USER']且沒有重定向。 因此,這取決於您使用的框架。

因此,如果您不確定是否發生重定向,最好檢查一下兩者。

我還注意到您正在使用AuthVasUseBasic On 如果您正在使用它,還應該檢查基本用戶身份驗證變量$_SERVER['USERNAME'] IIRC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM