1

我尝试通过两种不同的方式在 django 中创建Users ( ):django.contrib.auth.models.User

  1. 使用User.objects.create(username="<username_here>", password="<password_here>", email="<email_here>)-> 当我使用它时,登录用户和所有其他附带的好处auth.models.User都没有收到,例如,我不能authenticate在以这种方式创建的用户上使用。
  2. 使用User.objects.create_user("<username>", "<email>", "<password>"). 以这种方式做事没有问题,您可以使用 djangoauth应用程序附带的所有免费东西。

我的问题是,为什么会这样?

4

3 回答 3

1

查看create_user方法,您会发现密码使用set_password方法。

def create_user(self, username, email=None, password=None):
    """
    Creates and saves a User with the given username, email and password.
    """
    now = timezone.now()
    if not username:
        raise ValueError('The given username must be set')
    email = UserManager.normalize_email(email)
    user = self.model(username=username, email=email,
                      is_staff=False, is_active=True, is_superuser=False,
                      last_login=now, date_joined=now)

    user.set_password(password)
    user.save(using=self._db)
    return user
于 2013-09-10T07:33:46.777 回答
0

Django 的密码不存储为简单的文本,即密码本身。它实际上是 Django 用来验证给定密码 ( docs ) 的哈希字符串。

于 2013-09-09T13:22:54.870 回答
0

原因是该create_user函数是一个辅助函数,它获取您为密码输入的值并通过Django 的密码散列器运行它,该散列器采用“我喜欢猫”之类的“明文密码”,并使其更安全地存储为“0mvu3kmiXHh$” qhVGuNyO9cvV5spWeFrt9/ZhIR81GcvAGVKMgILwpkU="。因此,当您使用create而不是create_user仅传递“明文”密码作为密码时,这将不起作用,因为当用户输入“我喜欢猫”时,它将被哈希和比较,因为您设置了他们的直接使用密码而不是使用 Django 的哈希。

于 2013-09-09T19:14:50.423 回答