Доступ к REMOTE_USER из PHP / CakePHP - PullRequest
1 голос
/ 26 мая 2009

Я разрабатываю сайт CakePHP, для которого я только что включил аутентификацию VAS с использованием файла .htaccess:

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 является нормальным / обычным местом, где можно найти это значение, но никто, кажется, не знает почему!

Ответы [ 2 ]

2 голосов
/ 27 мая 2009

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 голос
/ 26 мая 2009

Это общая вещь PHP. Некоторые платформы перенаправляют страницы изнутри в соответствии с их политиками маршрутизации. Если вы перенаправите за пределы фреймворка, вы получите тот же результат.

Прямой доступ к странице за пределами фреймворка даст вам имена, которые вы изначально ожидали. Тем не менее, я заметил, что в CodeIgniter вы получаете $_SERVER['REMOTE_USER'] и без перенаправления. Так что это зависит от того, какую платформу вы используете.

Так что, вероятно, лучше проверить оба, если вы не уверены, происходит ли перенаправление.

Я также заметил, что вы используете AuthVasUseBasic On. Если вы используете это, вы также должны проверить базовую пользовательскую переменную аутентификации $_SERVER['USERNAME'] IIRC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...