2012-09-14 5 views
6

Utworzyłem użytkownika przy użyciu polecenia syncdb i loguje się idealnie. Ale gdy tworzę użytkownika z django administratora, zostanie utworzony pomyślnie, ale powoduje błąd podczas logowania go otrzymuję błąd:.Dlaczego hasło użytkownika nie jest hashed w django admin?

Unknown password hashing algorithm 'password'. Did you specify it in the PASSWORD_HASHERS setting? 

Na czym polega problem? jak mogę to rozwiązać, aby hasło było automatycznie szyfrowane podczas zapisywania użytkownika w adminie?

Odpowiedz

0

Django nie przechowuje haseł jako zwykłego tekstu. Najpierw je haszy i przechowuje hasz. Tak więc, kiedy użytkownik się loguje, Django stosuje tę samą funkcję hash do danych wejściowych użytkownika, a następnie porównuje dwa skróty - od danych wejściowych użytkowników i od tego, co jest przechowywane w bazie danych.

Jednak, aby uczynić rzecz bardziej elastyczną, Django nie przechowuje haseł hasłowych, dobrze, ale dodatkowo, przechowuje również algorytm, za pomocą którego został wygenerowany skrót. Wyobraź sobie ten scenariusz - do generowania skrótów haseł używasz funkcji hashującej X, ale wtedy zdajesz sobie sprawę, że ta funkcja nie jest już bezpieczna z jakiegokolwiek powodu i przełączysz się na funkcję mieszania Y. Jest to jednak problem, ponieważ w danym momencie hash hasła użytkownika przechowywany przy użyciu funkcji X nie będzie już mógł się zalogować. Dlatego Django przechowuje również metodę, według której został wygenerowany, oprócz samej wartości skrótu. Jest to miejsce, w którym przychodzi ustawienie PASSWORD_HASHERS. Fakt, że Django przechowuje metodę, za pomocą której jest generowany skrót w db, podczas odczytywania wartości, tak naprawdę nie mówi Django, jak wykonać samą funkcję skrótu. Tak więc PASSWORD_HASHERS jest czymś w rodzaju programu odwzorowującego między funkcją hashującą w języku Python (a właściwie klasą, ale tak czy inaczej ...) i wartością przechowywaną w bazie danych.

Wracam do pytania. Komunikat o błędzie oznacza, że ​​Django nie jest świadomy funkcji haszowania password, która została użyta do przechowywania skrótu hasła w bazie danych lub przynajmniej jej nie znajduje się w PASSWORD_HASHERS.

Mogę wymyślić kilka powodów, dla których może się to stać.

  • Upewnij się, że wtedy zrobić syncdb, używa tego samego pliku settings.py jak wtedy, gdy uruchomiony jest serwer, aby uzyskać dostęp do admina. Może się zdarzyć, że używane są inne ustawienia.

  • Jednak deweloperzy zwykle nie modyfikują PASSWORD_HASHERS w settings.py i po prostu używają wartości domyślnej. W takim przypadku upewnij się, że używasz tego samego Pythona z tą samą zainstalowaną wersją Django, gdy wykonujesz syncdb i kiedy uruchamiasz serwer. Jeśli robisz na przykład syncdb w jednym virtualenv i uruchamiasz serwer w innym env, to wersje Django mogą być inne, dlatego mogą mieć inne ustawienia dla PASSWORD_HASHERS i dlatego w przypadku uruchamiania syncdb może to być funkcja mieszająca, która nie jest zdefiniowane po uruchomieniu serwera.

+0

Możesz przeczytać więcej o tym, jak Django przechowywanie haseł w https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords lub przeczytać całą stronę, aby uzyskać lepsze zrozumienie działania mechanizmu Django, który obejmuje uwierzytelnianie użytkownika. – miki725

4

wpadłem na ten sam problem w sytuacji, gdy miałem podklasy user Django, a potem stworzył model admin niej i użył automatycznie wygenerowanego Django formularz administratora, aby utworzyć użytkownika.

Więc miałem coś takiego w moim models.py

class Employee(User): 
    job = models.CharField(max_length=100) 

i to w moim administratora.py

class EmployeeAdmin(admin.ModelAdmin): 
    pass 
admin.site.register(Employee, EmployeeAdmin) 

Teraz Django automatycznie tworzy formularz dodawania nowych pracowników do administratora Django. Ale gdy ten formularz zostanie użyty do utworzenia użytkownika, hasło w ogóle się nie uziemie. Z jakiegoś powodu Django tworzy normalne pole wprowadzania tekstu dla hasła, gdy model pochodzi od wbudowanego użytkownika Django. Nie wiem, czy miałeś ten sam przypadek.

Niestety nie mogłem znaleźć łatwego rozwiązania, aby to naprawić. Nie mam również pojęcia, dlaczego Django nie tworzy automatycznie odpowiedniego pola formularza dla hasła. Jedną z możliwości jest zastąpienie automatycznego formularza niestandardowym formularzem, który będzie zawierał widżet hasła. Zobacz https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides.

+0

należy rozszerzyć UserAdmin, a nie ModelAdmin –

2

Doświadczyłem tego samego problemu pokazanego w Rubinous odpowiedź i może być również twój problem.

Problemem stało, kiedy dziedziczy mojego modelu użytkownika z django.contrib.admin.ModelAdmin zamiast django.contrib.auth.admin.UserAdmin

Dzięki temu, byłem z pominięciem necesary funkcjonalność obsługi

2

rozwiązanie dla hasła są przechowywane jako tekst, a nie hashed hasło jest użycie UserAdmin z django.contrib.auth.admin zamiast z ModelAdmin.

from django.contrib.auth.admin import UserAdmin 

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin)