【问题标题】:How to generate a user password in plain SQL with Django + PostgreSQL如何使用 Django + PostgreSQL 在纯 SQL 中生成用户密码
【发布时间】:2019-12-05 23:00:01
【问题描述】:

我想从一个 Django 插入另一个域的另一个 Django 数据库,在 auth_user 表中插入一个正确的密码文本。

我试图生成一个加密函数,但我不知道 Django 如何将密码从纯文本生成到存储在数据库中的散列密码。

postgres_insert_query = """
          INSERT INTO auth_user (username, first_name, last_name, email, password) VALUES (%s,%s,%s,%s,%s)
        """
        record_to_insert = (username, first_name, last_name, email, password)
        cursor.execute(postgres_insert_query, record_to_insert)
        connection.commit()
        cursor.close()

【问题讨论】:

  • 不使用 Django 的 ORM 是否有特定原因。它具有对设置密码的内置支持。
  • @WillemVanOnsem 是的,我的 Django 应用程序从另一个 Django 应用程序生成/编辑/删除用户。不是同一个应用的settings.py中有多个数据库的情况。
  • 那么我认为最好调用管理命令来创建一个用户,例如django-createuser
  • @WillemVanOnsem 这个工具对服务器中的 shell 脚本生成用户很有用,但是我的 Django 应用程序在一个服务器中,而我插入用户的另一个 Django 应用程序被放置在其他服务器中。
  • 哈希算法不是固定的。您可以通过更改PASSWORD_HASHERS 设置来更改它:docs.djangoproject.com/en/2.2/topics/auth/passwords/…,因此即使您设法让它工作,稍后它也可能会失败,因为设置已更改。

标签: django python-3.x postgresql django-models


【解决方案1】:

User 模型的 set_password 方法将允许您访问原始密码和散列密码。这是一个例子:

class User(AbstractBaseUser, PermissionsMixin):
    [...fields...]
    def set_password(self, raw_password):
        # Update the password in the current Django Project
        super().set_password(raw_password)

        # Insert the password into the other database
        cursor = connections["otherdb"].cursor()
        postgres_insert_query = """
          INSERT INTO auth_user
          (username, first_name, last_name, email, password)
          VALUES (?, ?, ?, ?, ?)
        """
        cursor.execute(
            postgres_insert_query,
            [self.username, self.first_name, self.last_name, self.email, self.password]
        )
        cursor.close()

在示例中,我们可以访问raw_password,在调用set_password() 之后,我们可以访问self.password 中的哈希密码。每次在 ORM 中创建或修改用户时都会调用此方法。例如,只要最终用户或管理员在 Django 中更改了哈希密码,我就使用此方法更新 LDAP 中的哈希密码。祝你好运!

【讨论】:

    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2016-09-19
    • 2013-06-30
    • 2012-08-14
    • 2012-09-25
    相关资源
    最近更新 更多