【问题标题】:Admin page on django is brokendjango 上的管理页面坏了
【发布时间】:2012-02-09 07:12:21
【问题描述】:

我已经建立了一个带有管理页面的 django 项目。它在开发的前几周工作得很好,有一段时间没有使用管理页面,当我回到它时,管理页面坏了。无论我做什么,它都不允许我登录。

输入用户名和密码后,管理页面总是显示:

Please enter a correct username and password. Note that both fields are case-sensitive. 

我检查了数据库:超级用户存在并且 is_active、is_superuser 和 is_staff 都是 True。我已经使用 shell 来确保密码正确。我已经多次刷新、删除和重新创建数据库,以确保没有错误。我还仔细检查了中间件、url、INSTALLED_APPS 等,以确保它们都设置正确。

据我所知,管理页面运行良好,只是它们从不让任何人登录。

有什么想法,或者尝试调试的其他方法吗?这个bug我真的很困惑。

PS:如果重要的话,我使用 South 进行数据库迁移,使用 django-social-auth 进行 FB 登录,并使用单独的 local_settings.py 进行生产和开发(我已经检查了它们 - 冲突不是'那里。)

【问题讨论】:

  • 如果您使用 auth.views.login() 视图创建自己的登录页面会发生什么?
  • 看起来几乎相同的问题:“您的用户名和密码不匹配。请重试。”
  • 为了让 django-social-auth 用于 FB 登录,您是否修改了任何可能改变系统运行 authenticate() 和 login() 方式的代码?此外,在开发的几周内,您是否删除并重新创建了项目,使得 settings.py 的 SECRET_KEY = '...' 发生了变化?我认为这个密钥是用来解密密码的,但我并不肯定。
  • 我不知道。我添加了一个视图和一个模型,以及 settings.py 中的一些条目,但我不记得其他任何内容了。
  • 在 SECRET_KEY... 是的,我切换了 repos,当我这样做时,我再次运行 django-admin startproject。所以我的密码现在散列不同了。但我会认为创建一个新的超级用户和/或完全刷新和重新创建数据库会解决这个问题。顺便说一句,我在开发中使用 sqlite,以防这很重要。

标签: django django-admin


【解决方案1】:

试试这个;在tests.py中:

from django.contrib import auth

class AuthTestCase(TestCase):
    def setUp(self):
        self.u = User.objects.create_user('test@dom.com', 'test@dom.com', 'pass')
        self.u.is_staff = True
        self.u.is_superuser = True
        self.u.is_active = True
        self.u.save()

    def testLogin(self):
        self.client.login(username='test@dom.com', password='pass')

然后使用python manage.py test <your_app_name>.AuthTestCase 运行测试。如果通过,则系统正在工作,可能查看用户名和密码以确保它们是可接受的。

【讨论】:

  • 测试正常——返回OK。但是网站上的登录仍然不起作用。我已经使用 check_password 检查了 shell 中的密码,它返回 True。这里有一些更奇怪的事情:如果我输入我的电子邮件地址而不是超级用户名,我会得到“你的电子邮件地址不是你的用户名。试试 'agong'。”所以它显然能够访问数据库中的记录——它只是不让我登录。
【解决方案2】:

此问题可能与身份验证后端有关。 请检查您的设置文件中的 AUTHENTICATION_BACKENDS 参数。

试试下面的值:

AUTHENTICATION_BACKENDS = (
    ('django.contrib.auth.backends.ModelBackend'),
)

更多信息 Official Django Documentation

【讨论】:

  • 宾果游戏。这就是问题所在——当我添加 django-social-auth 时,它包含了一个完整的身份验证后端列表,包括 django.contrib.auth.backends.ModelBackend。我注释掉了所有我不打算使用的行,却没有注意到我也在注释掉那一行。
【解决方案3】:

您可以执行以下操作:

  • 输入您的 mysql(或其他数据库控制台)
  • 使用您的数据库;
  • 从 auth_user 中选择 *;
  • 观看 is_staff 和 is_superuser 项目
  • UPDATE auth_user SET is_staff = "1" where username = "root";

然后你就可以重新登录了!

【讨论】:

    【解决方案4】:

    我有同样的问题,但设置文件上的 AUTHENTICATION_BACKENDS 标志对我来说不是问题。以某种方式使用 Django Rest Framework,我修改了密码而没有调用 set_password,因此绕过了对密码的哈希处理。这就是它显示无效登录的原因。

    我能够通过运行简单的测试来检测问题,以便通过类似的测试来测试用户创建:

    from django.test import TestCase
    
    from django.contrib import auth
    from .models import *
    
    class AuthTestCase(TestCase):
        def setUp(self):
            self.u = UserProfile.objects.create_user('test@dom.com', 'iamtest', 'pass')
            self.u.is_staff = True
            self.u.is_superuser = True
            self.u.is_active = True
            self.u.save()
    
        def testLogin(self):
            self.client.login(username='test@dom.com', password='pass')
    

    值得一提的是,我正在创建一个名为 UserProfile 的自定义用户

    【讨论】:

      【解决方案5】:

      您是否使用自定义用户模型并忘记将其添加到settings.py?这就是我刚刚发生的事情。

      # Substituting a custom User model
      
      AUTH_USER_MODEL = "app_custom_auth.User"
      

      【讨论】:

        【解决方案6】:

        答案是:

        def create_superuser(self, username, email, password=None, **extra_fields):
            user = self.create_user(username, email, password=password, is_staff=True, **extra_fields)
            user.is_active = True
            user.save(using=self._db)
            return
        

        【讨论】: