Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python WSGI/Django:将用户名传递回Apache以访问日志_Python_Django_Apache_Authentication_Mod Wsgi - Fatal编程技术网

Python WSGI/Django:将用户名传递回Apache以访问日志

Python WSGI/Django:将用户名传递回Apache以访问日志,python,django,apache,authentication,mod-wsgi,Python,Django,Apache,Authentication,Mod Wsgi,我的Django应用程序部署在Apache下的mod_wsgi中,使用Django的标准WSGIHandler,通过Django端的表单登录对用户进行身份验证。因此,对于Apache,用户是匿名的。这使得Apache访问日志不那么有用 有没有办法在处理请求后通过WSGI包装将用户名传递回Apache,以便它出现在Apache访问日志中 (版本:Django 1.1.1、mod_wsgi 2.5、Apache 2.2.9)这可能不是您所期望的,但您可以在URL方案中使用用户名。这样,用户将位于ap

我的Django应用程序部署在Apache下的mod_wsgi中,使用Django的标准WSGIHandler,通过Django端的表单登录对用户进行身份验证。因此,对于Apache,用户是匿名的。这使得Apache访问日志不那么有用

有没有办法在处理请求后通过WSGI包装将用户名传递回Apache,以便它出现在Apache访问日志中


(版本:Django 1.1.1、mod_wsgi 2.5、Apache 2.2.9)

这可能不是您所期望的,但您可以在URL方案中使用用户名。这样,用户将位于apache日志的路径部分


您需要修改您的身份验证,以便在apache日志中可以看到需要身份验证的响应,否则在查看日志时,您可能会将未经身份验证的请求归因于经过身份验证的用户。例如,如果请求未经过身份验证,则返回一个临时重定向到登录页面。

只有在使用嵌入式模式并且使用名为apswigpy的单独包时,才能执行此操作,该包为原始Apache请求对象提供Python绑定。mod_wsgi包提供了一种可选机制,允许在wsgi环境中将原始Apache请求对象作为Python CObject引用传递。您可以将其与apswigpy结合使用,例如:

from apache.httpd import request_rec
r = request_rec(environ['apache.request_rec'])
r.user = user
至少我认为这将设置access日志可以使用的适当信息


你真的应该把这个讨论转到mod_wsgi邮件列表上。

你可以使用。一个
auth\u tkt
是一个带有用户id的签名cookie,Apache可以理解。当用户登录和注销时,您的web应用程序将不得不重新启动。Apache可以从cookie中派生出一个
远程用户
,将其传递给您的web应用程序或在同一服务器上运行的非Django web应用程序,将其包含在日志中,无论什么。

如果我错了,请纠正我,但是什么阻止您创建一些自定义中间件,将cookie设置为与当前登录用户的显示名称相等呢。该中间件将在每个视图上运行,因此,即使从技术上讲,用户可以欺骗其用户名以显示他希望显示的内容,但无论如何,它都会被重置,这不像是一种安全风险,因为用户名本身只是用于日志目的,与实际登录的用户没有任何关系。这似乎是一个足够简单的解决方案,然后Apache日志可以访问Cookie,从而使您能够最容易地访问Cookie。我知道有些人不喜欢给定用户伪造自己的用户名,但我认为这是完成任务的最简单的解决方案。特别是,在我的例子中,当它是一个iPhone应用程序,用户没有任何直接访问javascript控制台或cookie本身的权限时

最新版本(Django 2.x,Apache2.4)测试

来源


您需要在服务器配置、虚拟主机、目录或.htaccess中添加
WSGIPassAuthorization on
,据我所知,这不是很可能的,如果发布了有效的答案,我会非常感兴趣。出于我的目的,我使用了ApacheAuth;nginx通过将其包含在访问日志中,并在发送到客户端之前将其删除。通过Apache是否也有解决方案?登录视图重定向到/loggedin/redirecting to settings.Login\u REDIRECT\u URL。它很粗糙,但我喜欢。你是对的——不是我所期望的。:)我不接受URL中的用户名。谢谢;我在那里开始了一条线索,并接受了这个答案,因为这是我们可能最接近这里的答案。:)那里的讨论有没有提出更好的建议?@GunnlaugurBriem我想我发现了,但不清楚是否真的实施了什么。没有采取任何措施来支持它,因为这是一个极端的情况,只有少数人可能想要它,所涉及的工作是不合理的。@GrahamDumpleton我不知道有多少人会想要它,但我肯定会。听起来像是咳嗽票。一个小困难可能是绑定到IP,这可能会给负载平衡代理背后的任何人带来问题。也可能使您的应用程序很难反向代理。不,这不会导致问题。cookie可以选择绑定到远程用户的IP地址。根据代理的性质,您可以使用X-header或其他方式传递它;启用与其他应用程序的单点登录。还可以记录(和控制)对mod_wsgi未处理的静态介质的访问;这对我们来说不是一件大事,而是一个额外的好处。谢谢欺骗是不必要的:我们现在在应用程序中设置一个响应头(而不是cookie),并在发送到客户端之前将其放入nginx中,请参见“使用apache进行身份验证,如何通过wsgi传递该身份验证”。这与OP的要求相反。