为什么用户密码没有在django admin中进行哈希处理?

was*_*lli 7 python django admin

我在使用syncdb命令时创建了一个用户,它完美地登录.但是当我从django admin创建用户时,它已成功创建但在登录时会导致错误.我收到错误:

Unknown password hashing algorithm 'password'. Did you specify it in the PASSWORD_HASHERS setting?
Run Code Online (Sandbox Code Playgroud)

有什么问题?我如何解决它,以便在管理员中保存用户时自动加密密码?

Daw*_*ian 6

将密码存储为文本而不是散列密码的解决方案是使用 django.contrib.auth.admin 中的 UserAdmin 而不是 ModelAdmin。

from django.contrib.auth.admin import UserAdmin

class EmployeeAdmin(UserAdmin):
    pass

admin.site.register(Employee, EmployeeAdmin)
Run Code Online (Sandbox Code Playgroud)


mik*_*725 1

Django 不将密码存储为纯文本。它首先对它们进行哈希处理,然后它们存储哈希值。因此,当用户登录时,Django 将相同的哈希函数应用于用户输入,然后比较两个哈希值 - 来自用户输入和数据库中存储的内容。

然而,为了使事情更加灵活,Django 不存储密码哈希值,它确实存储了,但除此之外,它还存储生成哈希值的算法。想象一下这种情况 - 您使用散列函数X来生成密码散列,但随后您意识到该函数出于某种原因不再安全,并且您切换到散列函数Y。但这是一个问题,因为此时,无论谁的密码哈希是使用 function 存储的X,他们都将无法再登录。这就是为什么除了哈希值本身之外,Django 还存储生成 has 的方法。这就是PASSWORD_HASHERS设置的用武之地。事实上,Django 将生成哈希的方法存储在数据库中,当读取值时,它并没有真正告诉 Django 如何执行哈希函数本身。所以PASSWORD_HASHERS有点像哈希 Python 函数(实际上是一个类,但无论如何......)和存储在数据库中的值之间的映射器。

回到你的问题。该错误消息意味着 Django 不知道用于password在数据库中存储密码哈希值的哈希函数,或者至少它不在PASSWORD_HASHERS.

我可以想到可能发生这种情况的几个原因。

  • 确保您执行此操作后,它使用与您运行服务器来访问管理员时syncdb相同的文件。settings.py可能会出现使用不同设置的情况。

  • 然而开发者通常不会修改PASSWORD_HASHERSsettings.py而只是使用默认值。syncdb在这种情况下,请确保在运行服务器时使用相同的 Python 和相同安装的 Django 版本。例如,如果您syncdb在一个 virtualenv 中执行此操作,并在不同的 env 中运行服务器,则 Django 版本可能会有所不同,因此它们可能具有不同的设置,PASSWORD_HASHERS因此您在运行时syncdb可能会使用哈希函数,而该函数在您运行时未定义运行服务器。