【问题标题】:Django REMOTE_USER does not exist but HTTP_REMOTE_USER doesDjango REMOTE_USER 不存在,但 HTTP_REMOTE_USER 存在
【发布时间】:2015-09-10 18:03:16
【问题描述】:

全部,

我有一个非常简单的问题。我正在尝试按照以下说明使用 REMOTE_USER 变量使用 Django 身份验证:https://docs.djangoproject.com/en/1.8/howto/auth-remote-user/

然后,为了测试它是否有效,我正在使用邮递员 chrome 扩展程序。在那里我设置了一个名为“REMOTE-USER”的标题变量,然后为超级用户设置文本,然后我点击了 django 管理页面。我不会自动登录。

我在RemoteUserMiddleware 类的process_request 函数中设置了一个断点。当我提出请求时,我看到 request.META["HTTP_REMOTE_USER"] 存在但 request.META["REMOTE_USER"] 不存在。默认的RemoteUserMiddleware 变量使用header="REMOTE_USER"。似乎 HTTP Header 变量有一个 HTTP_ 前缀,所以我不明白这将如何工作。

我觉得我一定遗漏了一些明显的东西。谢谢!

【问题讨论】:

    标签: django httprequest python-requests


    【解决方案1】:

    REMOTE_USER 是由您的 Web 服务器(例如 Apache)设置的环境变量,而不是 HTTP 标头。如果它是 HTTP 标头,那么用户将能够欺骗标头,并以他们想要的任何用户身份登录。

    所有http头都以HTTP_为前缀,以便您可以区分它们和环境变量。

    您可以使用开发服务器设置环境变量,如下所示。

    REMOTE_USER=admin ./manage.py runserver
    

    【讨论】:

    • 那么有什么方法可以测试这个吗?我可以手动设置环境变量吗?另外,据我了解,是的,用户可以欺骗标头,但用例是应用程序位于设置 REMOTE_USER 的服务器后面,并且应用程序只是信任该服务器。
    • 使用 http 标头会有风险,因为除非经过适当配置,否则服务器会让标头通过。使用环境变量可以防止这种情况,因为它们不能由用户设置。是的,你可以在使用runserver时设置环境变量,看我更新的答案。
    • 您可以使用os.environ手动设置环境变量
    • 啊!这现在更有意义了。我只是有一个明显的误解。在运行中,单独机器上的服务器如何在运行应用程序的单独机器上设置环境变量?
    • @StephenHartzell 您不应该从另一台机器设置环境变量。您可能会在运行测试的任何地方设置它,并且可能只针对您正在运行的那些特定测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2018-03-26
    相关资源
    最近更新 更多