通过PHP在Apache中设置REMOTE_USER

时间:2012-03-15 20:50:58

标签: php apache authentication apache2

这个问题在概念上类似于this one,但我发现我需要与Apache进行更深入的集成。

我通过PHP验证用户并设置一个带有会话ID的cookie,然后可以在数据库表中查找该用户名以查找用户名。我还需要在Apache中设置REMOTE_USER变量,这样我就可以通过AJP连接和常规HTTP连接将该变量传递给其他应用程序服务器,这些服务器无法设置为从cookie中读取信息。 / p>

看来我需要更深入地与Apache(版本2)集成,甚至可能编写模块,以便正确地完成此操作。有没有人有任何关于如何使用尽可能少的非PHP胶水代码实现这一点的例子?虽然我当然熟悉其他几种语言,但我希望这个项目尽可能简单,以便那些必须在我之后维护它的人。

感谢您的任何指示!

1 个答案:

答案 0 :(得分:0)

PHP不提供PHP脚本访问Apache变量的权限。虽然设置环境变量有function,但据报道它没有设置REMOTE_USER。

您可以在PHP处理程序启动之前和之后通过在PHP工作之前和之后向阶段添加其他处理程序来执行您想要的操作。你可以用C编写处理函数;但是既然你的意思是有一个PHP程序员可以在你之后访问的解决方案,我相信Python是一个非常好的选择。

mod_python允许您非常轻松地执行此操作。如果你去它的网站,你可以看到它的最后一次更新是2008年2月;但它成熟稳定。它们不会继续开发,因为当前的Python-Apache集成继续在mod_wsgi而不是mod_python上。由于mod_wsgi坚持使用WSGI,因此它不像mod_python那样提供特定于Apache的功能。

安装mod_python之后,您只需要编写将在您需要时运行的简单函数。下面是在PHP之前和之后运行两个函数的示例,以便您可以访问由PHP设置的cookie。

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可以在其中导入它。您可以将它放在Python安装的site-packages文件夹中。

这是我用Python编写的Apache模块:

# -*- 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配置中的行,这样就不会对每个请求都进行无用的方法调用。