2012-09-14 27 views
6

Creé un usuario cuando uso el comando syncdb e inicia sesión perfectamente. Sin embargo, cuando se crea un usuario de administración de Django, se ha creado correctamente, pero causa de error al iniciar sesión en recibo de error:.¿Por qué la contraseña del usuario no está siendo hash en django admin?

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

Cuál es el problema? ¿Cómo puedo resolverlo para que la contraseña se encripte automáticamente al guardar al usuario en el administrador?

Respuesta

0

Django no almacena contraseñas como texto sin formato. Primero los hashes y ellos almacenan el hash. Entonces, cuando el usuario inicia sesión, Django aplica la misma función hash a la entrada de los usuarios y luego compara los dos hashes: desde la entrada de los usuarios y lo que está almacenado en el db.

Sin embargo, para hacer las cosas más flexibles, Django no almacena hash de contraseñas, pero sí, pero además, almacena el algoritmo por el que se generó el hash. Imagine este escenario: utiliza la función hash X para generar hashes de contraseña, pero luego se da cuenta de que esa función ya no es segura por algún motivo y cambia a la función hash Y. Sin embargo, eso es un problema porque, en el punto, cualquiera que tenga hash de contraseña almacenado mediante la función X, ya no podrá iniciar sesión. Es por eso que Django también almacena el método por el cual se generó el has, además del valor hash en sí mismo. Aquí es donde entra la configuración PASSWORD_HASHERS. El hecho de que Django almacene el método mediante el cual se genera el hash en el db, al leer el valor, realmente no le dice a Django cómo ejecutar la función hash. Entonces, PASSWORD_HASHERS es como un mapeador entre la función de hash Python (en realidad una clase, pero de todos modos ...) y el valor almacenado en el db.

Volviendo a su pregunta. El mensaje de error significa que Django no tiene conocimiento de la función hash password que se usó para almacenar el hash de la contraseña en su base de datos, o al menos no está en el PASSWORD_HASHERS.

No puedo pensar en algunas de las razones por las que eso podría suceder.

  • Asegúrese de que luego lo hace syncdb, utiliza el mismo archivo settings.py como cuando se está ejecutando el servidor para acceder a la administración. Puede ser que se usen diferentes configuraciones.

  • Sin embargo, los desarrolladores generalmente no modifican PASSWORD_HASHERS en el settings.py y simplemente usan el valor predeterminado. En ese caso, asegúrese de estar utilizando el mismo Python con la misma versión instalada de Django cuando lo haga syncdb y cuando ejecute el servidor. Si haces syncdb en un virtualenv, por ejemplo, y ejecutas el servidor en diferentes env, entonces las versiones de Django pueden ser diferentes, por lo tanto pueden tener configuraciones diferentes para PASSWORD_HASHERS y por lo tanto donde ejecutas syncdb, podría estar usando una función hash que no es definido cuando ejecuta el servidor.

+0

Puede leer más sobre cómo Django almacena las contraseñas en https://docs.djangoproject.com/en/1.4/topics/auth/#how-django-stores-passwords o leer toda la página para obtener una una mejor comprensión de cómo funciona Django auth, que incluye autenticación de usuario. – miki725

4

me encontré con el mismo problema en una situación en la que había una subclase de usuario del Django, a continuación, crea un modelo de administración para él y utiliza la forma de administración de Django generada automáticamente para crear un usuario.

así que tuve algo como esto en mi models.py

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

y esto en mi administración.py

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

Ahora Django crea automáticamente un formulario para agregar nuevos empleados en el administrador de Django. Pero cuando este formulario se usa para crear un usuario, la contraseña no se obtendrá en absoluto. Por alguna razón, Django crea un campo de entrada de texto normal para la contraseña cuando el modelo se deriva del usuario integrado de Django. No sé si tuviste el mismo caso.

Desafortunadamente no pude encontrar una solución fácil para arreglar esto. Tampoco tengo idea de por qué Django no está creando automáticamente el campo de formulario correcto para la contraseña. Sin embargo, una posibilidad sería anular el formulario automático con un formulario personalizado que incluiría un widget de contraseña. Ver https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides.

+0

necesita extender UserAdmin, no ModelAdmin –

2

Experimenté el mismo problema que se muestra en la respuesta Rubinosa y también podría ser su problema.

El problema ocurrió cuando la herencia de mi modelo de usuario de django.contrib.admin.ModelAdmin en lugar de django.contrib.auth.admin.UserAdmin

Al hacer esto, yo estaba pasando por alto la funcionalidad del usuario NECESARIO

2

Solución para la contraseña que se almacena como texto en lugar de la contraseña con algoritmo hash es utilizar UserAdmin de django.contrib.auth.admin en lugar de ModelAdmin.

from django.contrib.auth.admin import UserAdmin 

class EmployeeAdmin(UserAdmin): 
    pass 

admin.site.register(Employee, EmployeeAdmin) 
Cuestiones relacionadas