【问题标题】:Creating django users using two different ways使用两种不同的方式创建 django 用户
【发布时间】:2013-09-09 13:09:19
【问题描述】:

我尝试通过两种不同的方式在 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>")。以这种方式做事没有问题,您可以使用 django 的 auth 应用程序附带的所有免费内容。

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

【问题讨论】:

  • 第一种情况,创建后需要使用set_password函数。
  • @sneawo 更详尽的答案将不胜感激。

标签: python django django-models django-authentication


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-02
        • 2023-01-21
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多