代码之家  ›  专栏  ›  技术社区  ›  Gunnlaugur Briem

wsgi/django:将用户名传回apache以获取访问日志

  •  9
  • Gunnlaugur Briem  · 技术社区  · 14 年前

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

    处理完请求后,是否有方法将用户名通过wsgi包装器传递回Apache,以便它出现在Apache访问日志中?

    (版本:django 1.1.1,mod wsgi 2.5,apache 2.2.9)

    4 回复  |  直到 12 年前
        1
  •  4
  •   Graham Dumpleton    14 年前

    只有在使用嵌入式模式时才能这样做,并且只有在使用名为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邮件列表。

        2
  •  3
  •   joeforker    14 年前

    你可以使用 mod_auth_tkt . 安 auth_tkt 是一个带有Apache可以理解的用户ID的签名cookie。您的Web应用程序必须 set the cookie 当用户登录和注销时。Apache可以导出 REMOTE_USER 从cookie中,将其传递到您的Web应用程序或运行在同一服务器上的非Django Web应用程序,并将其包含在日志中,无论是什么。

        3
  •  1
  •   MattH    14 年前

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

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

        4
  •  1
  •   ecbtln    12 年前

    如果我错了,请纠正我,但是什么阻止您创建一些自定义中间件,将cookie设置为当前登录用户的显示名称。此中间件将在每个视图上运行,因此即使从技术上讲,用户可以欺骗其用户名来显示他想要显示的内容,但它仍然会被重置,这不像是一个安全风险,因为用户名本身只是用于日志目的,与实际登录的用户完全无关。这似乎是一个足够简单的解决方案,然后ApacheLog可以访问cookies,这样您就可以轻松访问了。我知道有些人不喜欢某个给定的用户欺骗自己的用户名,但我认为这是完成这项工作的最简单的解决方案。尤其是在我的例子中,当它是一个iPhone应用程序并且用户不能直接访问JavaScript控制台或cookie本身时。