我的Django应用程序,使用Django的标准WSGIHandler在Apache下部署在mod_wsgi中,通过Django端的表单登录对用户进行身份验证。所以对于Apache来说,用户是匿名的。这使得Apache访问日志变得不那么有用了。
有没有办法在处理请求后将用户名通过WSGI包装器传回Apache,以便它出现在Apache访问日志中?
(版本:Django 1.1.1,mod_wsgi 2.5,Apache 2.2.9)
答案 0 :(得分:4)
只有在使用嵌入模式时才能执行此操作,并且只有在使用名为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
至少我认为这将设置访问日志记录可以使用的适当信息。
你应该把这个讨论带到mod_wsgi邮件列表。
答案 1 :(得分:3)
您可以使用mod_auth_tkt。 auth_tkt
是一个带有Apache可以理解的用户ID的签名cookie。用户登录和注销时,您的Web应用程序必须set the cookie。 Apache可以从cookie中派生REMOTE_USER
,将其传递给您的Web应用程序或在同一服务器上运行的非Django Web应用程序,将其包含在日志中,等等。
答案 2 :(得分:1)
这可能不是您所期望的,但您可以在URL方案中使用用户名。这样,用户将位于apache日志的路径部分。
您需要修改身份验证,以便在apache日志中明确表示auth-required响应,否则在查看日志时,您可能会将未经身份验证的请求归因于经过身份验证的用户。例如。如果请求未经过身份验证,则返回临时重定向到登录页面。
答案 3 :(得分:1)
如果我错了,请纠正我,但是什么阻止你创建一些自定义中间件,设置一个等于登录当前用户的显示名称的cookie。这个中间件将在每个视图上运行,所以即使在技术上用户也是如此可以欺骗他的用户名来显示他想要显示的内容,它只会被重置并且它不像是一个安全风险,因为用户名本身只是用于日志目的,而不是与登录的实际用户相关。看起来像一个简单的解决方案,然后Apache日志可以访问cookie,以便您最简单的访问。我知道有些人不喜欢给定用户欺骗他自己的用户名的想法,但我认为这是完成工作的最简单的解决方案。特别是在我的情况下,当它是一个iPhone应用程序,用户没有任何直接访问JavaScript控制台或cookie本身。
答案 4 :(得分:0)
针对最新版本(Django 2.x,Apache 2.4)进行了测试
您需要在服务器配置,虚拟主机,目录或.htaccess中添加WSGIPassAuthorization on