2011-11-05 12 views
40

Domyślnie tworzę kilku użytkowników w moim fixtures/initial_data.json, aby mieć pewne "przedmioty" do testowania. Problem, który napotykam, to generowanie hasła. Mogę ustawić hasło w polach „”, ale nie wygeneruje zaszyfrowaną hasło:Użytkownicy w początkowej osobie danych

[ 
    { "model": "auth.user", 
     "pk": 1, 
     "fields": { 
      "username": "user1", 
      "password": "password" 
     } 
    } 
] 

Potrzebuję sposób generowania hasła użytkownika. Czy muszę to zrobić ręcznie i wygenerować ciąg, taki jak {hash_method}${salt}${hashed_password}, tak jak robi to Django?

Odpowiedz

78

Co może być łatwiejsze w tym przypadku (i jeśli trzeba tylko kilku użytkowników) jest stworzenie niektóre fałszywe konta użytkowników przez administratora (w tym haseł), a następnie zrzucić użytkowników do opraw plik używając dumpdata:

$ python manage.py dumpdata auth.User --indent 4 > users.json 

który automatycznie utworzy uchwyty dla Ciebie i mogą być wykorzystane później z loaddata

(można utworzyć jedno fałszywe konta i użyć skrótu w reszcie swoich opraw jeśli potrzeba dużo użytkownicy testowi)

https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-appname-appname-appname-model

+0

Hmm - stara się zrobić to dla mnie wyników w pustym wysypisko tutaj. –

+1

Okay - działa z lokalnej bazy danych sqlite, ale nie jest to główna baza danych mysql db. Czy to jest funkcja bezpieczeństwa? –

+2

"Możesz stworzyć jedno fałszywe konto i użyć skrótu w pozostałych urządzeniach, jeśli potrzebujesz wielu użytkowników testowych" -> ta wskazówka mnie uratowała! Wielkie dzięki :) – daveoncode

0

całkiem nieźle. nie powinno to być trudne. Najłatwiej byłoby spojrzeć na funkcję user.set_password, jak sądzę, i zobaczyć, jak to robią. prawdopodobnie możesz wywołać funkcję z terminala Pythona, a następnie skopiować go do swoich początkowych danych!

13

OK, zgadzam się z odpowiedziami, ale pozwól mi odpowiedzieć oryginalne pytania.

Jak zdobyć hasło "jak Django by je zahaczył"?

Spójrzmy na plik django/contrib/auth/hashers.py:

def make_password(password, salt=None, hasher='default'): 
    """ 
    Turn a plain-text password into a hash for database storage 

    Same as encode() but generates a new random salt. If 
    password is None or blank then UNUSABLE_PASSWORD will be 
    returned which disallows logins. 
    """ 
    # ... 

Zobacz przykład sesja

./manage.py shell 

>>> from django.contrib.auth.hashers import make_password, HASHERS 
>>> make_password('test') 
'pbkdf2_sha256$10000$vkRy7QauoLLj$ry+3xm3YX+YrSXbri8s3EcXDIrx5ceM+xQjtpLdw2oE=' 

# fix salt: 
>>> make_password('test', 'abc') 
'pbkdf2_sha256$10000$abc$MqJS5OAgSmf9SD9mfoY8fgLo8sSKmEcef0AjjMp1Q7w=' 

# use different (maybe faster, maybe unsafe!) hasher 

In [12]: HASHERS 
Out[12]: 
{'bcrypt': <django.contrib.auth.hashers.BCryptPasswordHasher object at 0x29c6d50>, 
'crypt': <django.contrib.auth.hashers.CryptPasswordHasher object at 0x29c6f50>, 
'md5': <django.contrib.auth.hashers.MD5PasswordHasher object at 0x29c6e10>, 
'pbkdf2_sha1': <django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher object at 0x29c6bd0>, 
'pbkdf2_sha256': <django.contrib.auth.hashers.PBKDF2PasswordHasher object at 0x29c6cd0>, 
'sha1': <django.contrib.auth.hashers.SHA1PasswordHasher object at 0x29c6dd0>, 
'unsalted_md5': <django.contrib.auth.hashers.UnsaltedMD5PasswordHasher object at 0x29c6ed0>, 
'unsalted_sha1': <django.contrib.auth.hashers.UnsaltedSHA1PasswordHasher object at 0x29c6e50>} 

In [14]: [make_password('test', hasher=name) for name in HASHERS] 
Out[14]: 
['sha1$LdKsAbJRjlVP$2eb2346387cc510f576f2f11eebdfe18b20d1be1', 
'pbkdf2_sha256$10000$Ck8gtWQJnJ9x$M/OqP548d5KcPqFuVRgXb84unjYbYDH6oyimbDndE3k=', 
'pbkdf2_sha1$10000$BJqRu5OwylVF$hUvMLIzBujt9kPbML/dei1vLiMQ=', 
'crypt$$d9grSeqDhMFek', 
'098f6bcd4621d373cade4e832627b4f6', 
'sha1$$a94a8fe5ccb19ba61c4c0873d391e987982fbbd3', 
'bcrypt$$2a$12$WlJP5zm2lmdJ4g/pSE1xF.d/8w.XRT5mo/vGlkKdglBtzcxKw7XJS', 
'md5$txHYmSYJKhD4$69286d4a1abd348fbddc9df7687e2ed4'] 

Można również ręcznie korzystania encode metodę hasher, ale powyższa funkcja narzędzie pozwoli Ci w sposób łatwiejszy sposób.

7

Podczas pisania artykułów do testów napotkałem ten sam problem. Oto, jak sobie z tym radzę w testach jednostkowych.

Tworzenie danych z poziomu administratora i umieszczanie ich w urządzeniu działa, ale nie bardzo lubię być zależnym od ręcznego robienia tego. Oto, co robię -

Stwórz urządzenie dokładnie tak, jak robiłeś, a potem w metodzie setUp, set_password dla użytkowników.

user_fixture.json

[ 
    { "model": "auth.user", 
     "pk": 1, 
     "fields": { 
      "username": "user1", 
      "password": "password" 
     } 
    } 
] 

test_user.py

def setUp(self): 
    self.User = get_user_model() 

    # Fix the passwords of fixtures 
    for user in self.User.objects.all(): 
     user.set_password(user.password) 
     user.save() 

ten sposób mogę pisać czysto hasła w urządzeniu i odesłać do nich, kiedy trzeba i stworzyć więcej urządzeń po prostu edytując plik urządzenia.

2

Dodając do odpowiedzi @GauravButola, utworzyłem niestandardowe polecenie zarządzania, aby załadować urządzenie i naprawić hasła w jednym kroku. Jest to przydatne, gdy nie używa się frameworka testowego do konfiguracji haseł. Przykład działa z django 1.11 i prawdopodobnie wcześniejszymi wersjami.

W swojej aplikacji zapewniając urządzenie dodać komendę swój zarządzania (to czasy python3, więc pominąłem PYS startowy):

yourapp/ 
    models.py 
    fixtures/ 
     initial_data.json 
    management/ 
     commands/ 
      initdata.py 

Z initdata.py patrząc tak:

from django.core.management import BaseCommand, call_command 
from django.contrib.auth.models import User 
# from yourapp.models import User # if you have a custom user 


class Command(BaseCommand): 
    help = "DEV COMMAND: Fill databasse with a set of data for testing purposes" 

    def handle(self, *args, **options): 
     call_command('loaddata','initial_data') 
     # Fix the passwords of fixtures 
     for user in User.objects.all(): 
      user.set_password(user.password) 
      user.save() 

Teraz możesz wczytać initial_data i mieć poprawne hasła, dzwoniąc pod numer:

./manage.py initdata 
0

Informacje o użytkownikach zrzutów m bazy danych:

$ python manage.py dumpdata auth.User --indent 4 > users.json 

importu/ładowania danych especific JSON Oprawa:

$ python manage.py loaddata users.json