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

问题描述 投票:9回答:5

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

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

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

python django apache authentication mod-wsgi
5个回答
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邮件列表。


3
投票

你可以使用mod_auth_tktauth_tkt是一个带有Apache可以理解的用户ID的签名cookie。当用户登录和注销时,您的Web应用程序必须使用set the cookie。 Apache可以从cookie中派生出REMOTE_USER,将其传递给您的Web应用程序或在同一服务器上运行的非Django Web应用程序,将其包含在日志中,等等。


1
投票

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

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


1
投票

如果我错了,请纠正我,但是什么阻止你创建一些自定义中间件,设置一个等于登录当前用户的显示名称的cookie。这个中间件将在每个视图上运行,所以即使技术上用户可以欺骗他用户名显示他想要显示的内容,它只是被重置而且它不像是一个安全风险,因为用户名本身只是用于日志目的,而不是与登录的实际用户相关。这似乎是一个简单的解决方案,然后Apache日志可以访问cookie,以便您最简单的访问。我知道有些人不喜欢给定用户欺骗他自己的用户名的想法,但我认为这是完成工作的最简单的解决方案。特别是在我的情况下,当它是一个iPhone应用程序,用户没有任何直接访问JavaScript控制台或cookie本身。


0
投票

最新的(Django 2.x,Apache 2.4)测试

来源https://www.django-rest-framework.org/api-guide/authentication/#apache-mod_wsgi-specific-configuration

您需要在服务器配置,虚拟主机,目录或.htaccess中添加WSGIPassAuthorization on

© www.soinside.com 2019 - 2024. All rights reserved.