我使用syncdb
命令創建了一個用戶,並且它完全登錄。但是,當我創建Django管理用戶,它是成功創建,但會導致錯誤在登錄時它,我得到錯誤:爲什麼用戶密碼不在django admin中被散列?
Unknown password hashing algorithm 'password'. Did you specify it in the PASSWORD_HASHERS setting?
有什麼問題?如何解決這個問題,以便將用戶保存到管理員時自動加密密碼?
我使用syncdb
命令創建了一個用戶,並且它完全登錄。但是,當我創建Django管理用戶,它是成功創建,但會導致錯誤在登錄時它,我得到錯誤:爲什麼用戶密碼不在django admin中被散列?
Unknown password hashing algorithm 'password'. Did you specify it in the PASSWORD_HASHERS setting?
有什麼問題?如何解決這個問題,以便將用戶保存到管理員時自動加密密碼?
Django不會將密碼存儲爲純文本。它首先對它們進行散列,然後它們存儲散列。因此,當用戶登錄時,Django將相同的散列函數應用於用戶輸入,然後比較這兩個散列 - 從用戶輸入和存儲在db中的內容。
但是爲了使事情更加靈活,Django不存儲密碼哈希值,好吧,除此之外,它還存儲生成哈希值的算法。想象一下這種情況 - 你使用散列函數X
來生成密碼哈希,但是後來你意識到,無論出於何種原因,該函數都不再安全,並且你切換到哈希函數Y
。然而,這是一個問題,因爲在任何時候,使用功能X
存儲誰是密碼散列,他們將無法再登錄。這就是爲什麼除了散列值本身之外,Django還存儲生成has的方法。這是設置PASSWORD_HASHERS
的地方。Django存儲在db中生成哈希的方法,讀取值時,它並不真正告訴Django如何執行哈希函數本身。所以PASSWORD_HASHERS
有點像哈希Python函數(實際上是一個類,但無論如何...)和存儲在數據庫中的值之間的映射器。
所以回到你的問題。該錯誤消息意味着Django不知道散列函數password
,它用於將密碼的散列存儲在數據庫中,或者至少不存在於PASSWORD_HASHERS
中。
我能想到爲什麼會發生這種情況的幾個原因。
確保那你就syncdb
,它使用相同的settings.py
文件,當您正在運行的服務器訪問管理的。可能會出現這種情況,即使用不同的設置。
但是開發人員通常不會在settings.py
中修改PASSWORD_HASHERS
,而只是使用默認值。在這種情況下,確保當您執行syncdb
時以及在運行服務器時,您使用的是與Django的安裝版本相同的Python。例如,如果您在一個virtualenv中執行syncdb
,並且在不同的env中運行服務器,那麼Django版本可能會不同,因此它們可能具有不同的PASSWORD_HASHERS
設置,因此在運行syncdb
時,它可能使用的散列函數不是在運行服務器時定義。
我跑進在我的子類Django的用戶的情況相同的問題,那麼創建的模型管理它,並使用自動生成的Django管理形式來創建一個用戶。
所以我有這樣的事情在我的models.py
class Employee(User):
job = models.CharField(max_length=100)
,這在我的管理。py
class EmployeeAdmin(admin.ModelAdmin):
pass
admin.site.register(Employee, EmployeeAdmin)
現在Django自動創建一個用於在Django管理中添加新員工的表單。但是當這個表單用於創建用戶時,密碼根本不會被散列。因此,出於某種原因,當模型從Django的內置用戶派生時,Django爲密碼創建普通文本輸入字段。我不知道你是否有同樣的情況。
不幸的是我找不到一個簡單的解決方案來解決這個問題。我也不知道爲什麼Django不會自動爲密碼創建正確的表單域。然而,有一種可能性是使用包含密碼小部件的自定義表單覆蓋自動錶單。見https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides。
您需要擴展UserAdmin,而不是ModelAdmin –
我遇到了Rubinous答案中顯示的相同問題,也可能是您的問題。
問題從django.contrib.admin.ModelAdmin
繼承時,我的用戶模型來代替django.contrib.auth.admin.UserAdmin
通過這樣做,我繞過
密碼解決方案被存儲爲文本而不是哈希密碼necesary用戶功能使用UserAdmin發生從django.contrib.auth.admin而不是ModelAdmin。
from django.contrib.auth.admin import UserAdmin
class EmployeeAdmin(UserAdmin):
pass
admin.site.register(Employee, EmployeeAdmin)
您可以在https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords閱讀更多關於如何Django的將密碼存儲或讀取整個頁面以獲得更好地理解Django身份驗證如何工作,其中包括用戶身份驗證。 – miki725