Пользователи в исходных данных
Я создаю несколько пользователей по умолчанию в моем fixtures/initial_data.json
, чтобы иметь некоторые тестовые "темы". Проблема, с которой я столкнулся, - генерация пароля. Я могу установить пароль в "полях", но это не приведет к генерации хешированного пароля:
[
{ "model": "auth.user",
"pk": 1,
"fields": {
"username": "user1",
"password": "password"
}
}
]
Мне нужен способ создания пароля пользователя. Должен ли я сделать это вручную и создать строку типа {hash_method}${salt}${hashed_password}
, как это делает Django?
Ответы
Ответ 1
Что может быть проще в этом случае (а если вам нужно всего несколько пользователей) - создать некоторые поддельные учетные записи пользователей через админ (включая пароли), а затем выгрузить пользователей в файл настроек с помощью dumpdata:
$ python manage.py dumpdata auth.User --indent 4 > users.json
который автоматически создаст светильники для вас и может быть использован позже с loaddatap >
(Вы могли бы просто создать одну фальшивую учетную запись и использовать хэш в остальных ваших светильниках, если вам нужно много тестируемых пользователей)
https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-appname-appname-appname-model
Ответ 2
Хорошо, я согласен с ответами, но позвольте мне ответить на оригинальные вопросы.
Как получить пароль "как Django его хэшировал"?
Посмотрите файл 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.
"""
# ...
См. этот пример сеанса:
./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']
Вы также можете вручную использовать метод hasher encode
, но указанная выше функция утилиты вы упростили.
Ответ 3
Я столкнулся с той же проблемой при написании приборов для тестов. Вот как я обрабатываю это в модульных тестах.
Создание данных из admin и их сбрасывание в инструменты, но мне не совсем нравится, что вы зависите от этого вручную. Итак, вот что я делаю -
Создайте прибор так же, как и вы, а затем в setUp
, set_password
для пользователей.
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()
Таким образом, я могу чисто писать пароли в приборе и возвращаться к ним, когда мне нужно, и создавать дополнительные светильники, просто отредактировав файл прибора.
Ответ 4
Добавив к ответу @GauravButola, я создал пользовательскую команду управления для загрузки прибора и исправления паролей за один шаг. Это полезно, если вы не используете среду тестирования для настройки паролей. В примере работает с django 1.11 и, возможно, более ранними версиями.
В приложении, в котором приложение оснастит, добавьте команду управления (это python3 раз, поэтому я опустил init pys):
yourapp/
models.py
fixtures/
initial_data.json
management/
commands/
initdata.py
С initdata.py выглядит так:
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()
Теперь вы можете загрузить свои начальные_данные и иметь действительные пароли, позвонив:
./manage.py initdata
Ответ 5
уверен, что вы это делаете. это не должно быть так сложно. Самый простой способ - посмотреть на функцию user.set_password
, я думаю, что это так, и посмотрите, как они это делают. вы можете, вероятно, вызвать функцию из терминала python, а затем скопировать ее в свои исходные данные!