Django 管理员身份验证失败

Posted

技术标签:

【中文标题】Django 管理员身份验证失败【英文标题】:Django admin authentication failure 【发布时间】:2011-01-11 16:21:25 【问题描述】:

第一次按下“登录”按钮时登录 django admin 失败 时间,但再次按“返回”和“登录” - 使用户登录 成功。

我在这里使用 zc.buildout 部署 Django 应用程序,设置类似 到这里描述的http://www.meppum.com/2009/jan/17/installing-django-ubuntu-intrepid/。 nginx(在 127.0.0.1:8003 上侦听)在 Apache 之外运行(侦听 在 127.0.0.1:8001),两台服务器的配置都在 帖子的结尾。我正在以 127.0.0.1:8003/ 的身份访问我的 django 应用程序。

所以,127.0.0.1:8003/admin/ 打开 django 管理员登录表单。 1)输入用户名/密码,按“登录”重定向到(出于某种未知原因?)127.0.0.1/ admin,因此最终什么都没有,因为没有服务器在监听 在 80 端口上。 HTTP 跟踪(点击登录后:http://127.0.0.1:8003/admin/)

POST /admin/ HTTP/1.1
Host: 127.0.0.1:8003
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8003/admin/
Cookie: JSESSIONID=0D287C17FBA82223AB7D5884EA534967; sessionid=c65c7af8ebde9e6bdf9c739a731d376b
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
username=to&password=password&this_is_the_login_form=1

HTTP/1.x 302 FOUND
Server: nginx/0.8.29
Date: Mon, 01 Feb 2010 10:27:44 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Expires: Mon, 01 Feb 2010 10:27:44 GMT
Vary: Cookie
Etag: "d41d8cd98f00b204e9800998ecf8427e"
Cache-Control: max-age=0
Set-Cookie: sessionid=9db437da69c359136786696f90ba89f2; expires=Mon, 15-Feb-2010 10:27:44 GMT; Max-Age=1209600; Path=/
Last-Modified: Mon, 01 Feb 2010 10:27:44 GMT
Location: http://127.0.0.1/admin/
Content-Length: 0

2) 再次按下浏览器的返回,并再次“登录”按钮(或 按浏览器的“返回”和“刷新”)成功登录。 HTTP 跟踪:

POST /admin/ HTTP/1.1
Host: 127.0.0.1:8003
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.17) Gecko/2010010604 Ubuntu/9.04 (jaunty) Firefox/3.0.17
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://127.0.0.1:8003/admin/
Cookie: JSESSIONID=0D287C17FBA82223AB7D5884EA534967; sessionid=9db437da69c359136786696f90ba89f2
Content-Type: application/x-www-form-urlencoded
Content-Length: 55
username=to&password=password&this_is_the_login_form=1

HTTP/1.x 200 OK
Server: nginx/0.8.29
Date: Mon, 01 Feb 2010 10:52:02 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Mon, 01 Feb 2010 10:52:02 GMT
Vary: Cookie
Etag: "3355a46fb32d7cb6ab21262c359d9eec"
Cache-Control: max-age=0
Last-Modified: Mon, 01 Feb 2010 10:52:02 GMT

看起来这是一个与 cookie 相关的问题,但我想,这是 问题也可能出在 apache 和/或 nginx 配置中。

任何想法如何使管理员登录表单立即工作?

干杯!

P.S.configs:

apache 虚拟主机配置:

<VirtualHost *:8001>

    <Directory /home/toinbis/Desktop/programming/project/runtime/
htdocs/django_wsgi/>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIDaemonProcess tsd user=www-data group=www-data threads=25
    WSGIProcessGroup tsd

    WSGIScriptAlias / /home/toinbis/Desktop/programming/project/
runtime/htdocs/django_wsgi/djproject.wsgi

    LogLevel warn
    ErrorLog  /home/toinbis/Desktop/programming/project/runtime/logs/
apache_tsd_error.log
    CustomLog /home/toinbis/Desktop/programming/project/runtime/logs/
apache_tsd_access.log combined

    ServerName localhost
</VirtualHost>

nginx配置:

daemon off;
#user www-data;
worker_processes  2;

error_log  /home/toinbis/Desktop/programming/project/runtime/logs/
nginx_general_error.log;
pid        /home/toinbis/Desktop/programming/project/runtime/var/pids/
nginx.pid;

events 
    worker_connections  1024;
    #server_names_hash_bucket_size: 128;



http 
    include       /home/toinbis/Desktop/programming/project/runtime/
etc/nginx_conf/mime.types;
    default_type  application/octet-stream;

    access_log  /home/toinbis/Desktop/programming/project/runtime/logs/
nginx_access.log;
    error_log   /home/toinbis/Desktop/programming/project/runtime/logs/
nginx_error.log;

    sendfile        on;
    tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  2;
    tcp_nodelay        on;

    server_names_hash_bucket_size 128;
    #server_name_hashes 128;
    gzip  on;
    gzip_comp_level 2;
    gzip_proxied any;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)"; #iš ubuntu
    gzip_types text/plain text/css application/x-javascript text/xml
application/xml application/xml+rss text/javascript;

upstream backend 
  server 127.0.0.1:8001;



server 
            listen   8003;
            server_name localhost;

            error_log /home/toinbis/Desktop/programming/project/
runtime/logs/project_nginx_error.log;
            access_log /home/toinbis/Desktop/programming/project/
runtime/logs/project_nginx_access.log;

            location / 
                        proxy_pass  http://backend/;
                        include     /home/toinbis/Desktop/programming/
project/runtime/etc/nginx_conf/nginx_proxy_1.conf;
            

            location  /media/ 
                        root /home/toinbis/Desktop/programming/project/
src/tsd/core/;
            



干杯, 到

【问题讨论】:

【参考方案1】:

@Eugene Morozov 指出了问题的最终结果,但我认为解决方案更深层次。

返回的Location 标头不正确:

Location: http://127.0.0.1/admin/

这显然缺少端口号。不幸的是,很难确切地说出这是从哪里来的。您可能会遇到自动更改 Location 标头的 Nginx 或 Apache。我建议执行以下操作以查看问题出现在哪里:

在您每次登录之前清除您的 cookie,否则您可能会得到误报。 直接转到您的 Apache 实例并查看问题是否仍然存在。 http://127.0.0.1:8001/admin/ 如果位置标头上没有端口: 在某个随机端口(例如 8005)上启动 Django 开发服务器并查看问题是否仍然存在: 如果问题仍然存在,则它在您的代码中。 如果问题没有持续存在,则 Apache 要么做了一些奇怪的事情,要么 WSGI/Django 没有获得确定端口号所需的所有信息。 确保 wsgi 脚本和 django 应用都可以看到环境中的端口号。 如果位置标头中有端口: Nginx 出于某种原因正在剥离它。 尝试将 Apache 排除在循环之外,您可能不需要它。 启动 Django 作为 FastCGI 服务器并将 Nginx 连接到该服务器而不是 Apache。 这实际上会降低服务器上的一些开销(更少的请求传递、额外的线程、内存使用等)。 相当不错的设置指南over here。

忍者编辑! 不确定这是否会有所帮助,但似乎 Nginx 中有一个选项可以忽略重定向中的端口号。该 URL 已失效,因此我将其从 over here 粘贴。

http://wiki.codemongers.com/NginxHttpCoreModule#port_in_redirect

syntax: port_in_redirect [ on|off ]
default: port_in_redirect on
context: http, server, location

指令允许或禁止端口 重定向中的指示由 nginx。

【讨论】:

哇,好答案!是“启动 Django 作为 FastCGI 服务器并将 Nginx 连接到该服务器而不是 Apache。”部署的一般报价?是否有任何测试显示通过在 apache_modwsgi 上使用 fastcgi 可以节省多少开销?会让你知道问题的追踪是如何进行的.. 我不知道任何基准,只是常识。如果不需要,为什么要运行两个成熟的 Web 服务器? (假设您的项目不大,在这种情况下有理由这样做。) Apache-only 运行良好,好吧,所以“Nginx 出于某种原因剥离它”是一个较低级别的原因。我正在深入研究 nginx 配置...再次感谢! @toinbis:我用来自似乎有类似问题的 Ruby 网站的更多信息更新了这个问题。看看吧。 Ninja Edit 太棒了——直接指出它所在的位置(我想)是必要的。我现在在 /location 设置中使用不同的设置,将用结果更新我的帖子。杰克,非常感谢!【参考方案2】:

您的设置不正确。 Django 认为它运行在 80 端口上。看第一个 HTTP 响应中的这一行:

Location: http://127.0.0.1/admin/

很遗憾,我现在不明白为什么会发生这种情况。在这种情况下,我更喜欢使用调试器单步执行相关的 Django 代码。

【讨论】:

尤金,感谢您的帮助。我现在正在尝试调试...开发服务器似乎在相同的设置下运行良好...【参考方案3】:

尤格,詹姆斯,

再次感谢您的帮助!

解决方案原来被描述为here:将proxy_set_headerHost $host; 更改为proxy_set_headerHost $host:$server_port; 成功了!

【讨论】:

以上是关于Django 管理员身份验证失败的主要内容,如果未能解决你的问题,请参考以下文章

尽管凭据正确,Django Gmail 身份验证失败

SQL server2000 windows身份验证失败怎么办

SQL server2000 windows身份验证失败怎么办

使用自定义管理站点自动注册 Django 身份验证模型

使用身份验证令牌的 Axios 请求有时会在 Safari 中失败

测试 Django 管理操作(重定向/身份验证问题)