you variable tutorial template tag register forget examples did custom django django-models django-authentication

variable - import django template



Usuarios en el accesorio de datos inicial (6)

Agregando a la respuesta de @GauravButola, creé un comando de administración personalizado para cargar el dispositivo y arreglar las contraseñas en un solo paso. Esto es útil cuando no se utiliza un marco de prueba para configurar la configuración de las contraseñas. El ejemplo está funcionando con django 1.11 y probablemente con versiones anteriores.

En su aplicación que proporciona el accesorio, agregue su comando de administración (esto es python3 veces, por lo que omite el init pys):

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

Con initdata.py con el siguiente aspecto:

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()

Ahora puede cargar su initial_data y tener contraseñas válidas llamando:

./manage.py initdata

Estoy creando algunos usuarios de forma predeterminada en mis fixtures/initial_data.json para tener algunos "sujetos" de prueba. El problema que estoy experimentando es la generación de contraseñas. Podría establecer la contraseña en los ''campos'', pero eso no generará una contraseña hash:

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

Necesito una forma de generar la contraseña del usuario. ¿Debo hacerlo manualmente y generar una cadena como {hash_method}${salt}${hashed_password} como lo hace Django?


De acuerdo, estoy de acuerdo con las respuestas, pero déjame responder las preguntas originales.

¿Cómo obtener la contraseña "como Django lo habría maquinado"?

Veamos el archivo 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. """ # ...

Vea esta sesión de ejemplo:

./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'']

También puede usar manualmente el método de encode hasher, pero la función de utilidad anterior lo cubre de una manera más fácil.


Lo que podría ser más fácil en este caso (y si solo necesita algunos usuarios) es crear algunas cuentas de usuario falsas a través del administrador (incluidas las contraseñas) y luego volcar a los usuarios a un archivo de dispositivos usando dumpdata :

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

que automáticamente creará los accesorios para ti y se puede usar más adelante con loaddata

(Podrías simplemente crear una cuenta falsa y usar el hash en el resto de tus aparatos si necesitaras muchos usuarios de prueba)

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


Me encontré con el mismo problema al escribir accesorios para las pruebas. Así es como estoy manejando esto en pruebas unitarias.

Crear datos desde el administrador y colocarlos en el dispositivo funciona, pero no me gusta depender de hacerlo manualmente. Así que esto es lo que hago:

Cree el accesorio tal como lo hizo y luego, en el método set_password , set_password la set_password para los usuarios.

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()

De esta forma puedo escribir las contraseñas de forma limpia en el aparato y volver a consultarlas cuando sea necesario y crear más elementos simplemente editando el archivo del dispositivo.


Vaciar información de usuarios de DataBase:

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

Importar / cargar datos específicos de JSON accesorio:

$ python manage.py loaddata users.json


bastante seguro de que lo haces. no debería ser tan difícil. La manera más fácil sería mirar la función user.set_password creo que es, y ver cómo lo hacen. ¡probablemente puedas llamar a la función desde un terminal python y luego copiarla en tus datos iniciales!