Установите REMOTE_USER в Apache через PHP - PullRequest
0 голосов
/ 16 марта 2012

Этот вопрос в принципе похож на на этот , за исключением того, что я вижу, что мне нужна более глубокая интеграция с Apache.

Я аутентифицирую пользователей через PHP и устанавливаю cookie с идентификатором сессиизатем его можно найти в таблице базы данных, чтобы найти имя пользователя.Мне нужно также установить переменную REMOTE_USER в Apache, чтобы я мог передавать эту переменную через соединение AJP и обычное соединение HTTP другим серверам приложений, которые нельзя настроить на чтение информации из файла cookie.

Похоже, мне нужно более глубоко интегрироваться с Apache (версия 2), возможно, даже написать модуль, чтобы сделать это правильно.У кого-нибудь есть какой-нибудь пример того, как это можно сделать с помощью как можно меньшего количества не-PHP-кода?Хотя я, конечно, знаком с несколькими другими языками, я надеялся сохранить этот проект как можно более простым для тех, кому придется поддерживать его после меня.

Спасибо за любые указатели!

1 Ответ

0 голосов
/ 01 июля 2012

PHP не предоставляет PHP-сценариям доступ к переменным Apache.Хотя существует функция для установки переменных среды, сообщается, что она не устанавливает REMOTE_USER.

Вы можете делать то, что хотите, до запуска обработчика PHP и после его завершения, добавив другие обработчики.к этапам до и после работы PHP.Вы можете написать свои функции-обработчики в C;но поскольку вы хотите иметь решение, к которому PHP-программисты могут получить доступ после вас, я считаю, что Python - очень хорошая альтернатива.

mod_python позволяет вам сделать это очень легко.Если вы зайдете на его сайт, вы увидите, что его последнее обновление - февраль 2008 года;но он зрелый и стабильный.Они не продолжают разработку, потому что текущая интеграция Python-Apache продолжается на mod_wsgi вместо mod_python.Поскольку mod_wsgi придерживается WSGI, он не обеспечивает специфичные для Apache функциональные возможности, как это делает mod_python.

После установки mod_python все, что вам нужно, - это написать простые функции, которые будут запускаться, когда вы этого захотите.Ниже приведен пример запуска двух функций до и после PHP, чтобы вы могли получить доступ к cookie-файлу, который был установлен PHP.

Конфигурация Apache:

# Enable mod_python:
LoadModule python_module modules/mod_python.so

# Enable it as a handler:
AddHandler mod_python .py
    # extension does not matter since we are not setting contentHandlers.
    # py files will continue being served as text/plain if you have any of them
    # under your document root.

# Handler that will run before PHP:
PythonFixupHandler set_auth_user

# Handler that will run after PHP:
PythonCleanupHandler set_auth_user

Эта конфигурация требует set_auth_user.py где Pythonможет импортировать это.Вы можете поместить его в папку site-packages установки Python.

Вот наш модуль Apache, написанный на Python:

# -*- coding: utf-8 -*-
from mod_python import apache

def fixuphandler(req):
    apache.log_error("starting :"+str(req.headers_out.get('Set-Cookie')))
    return apache.OK

def cleanuphandler(req):
    apache.log_error("cleaning up: "+str(req.headers_out.get('Set-Cookie')))
    req.user='hasanyasin' #this is how you update AUTH_USER
    return apache.OK

Вот наш PHP-файл:

<?php
setcookie('abc','foobar');
?>

Вот мой журнал Apache после запроса к серверу:

[Sun Jul 01 15:29:31 2012] [error] cleaning up: None
[Sun Jul 01 15:29:31 2012] [error] cleaning up: abc=foobar

Я надеюсь, что это решит вашу проблему так, как вам нужно.Я добавил две функции обработчика для демонстрации.Если вам нужен только один из них, удалите строку в конфигурации Apache, чтобы не вызывать бесполезный вызов метода для каждого запроса.

...