2011-11-17 20 views
109
OperationalError at /admin/ 

FATAL: Peer authentication failed for user "myuser" 

Este es el error que recibo cuando trato de acceder a mi sitio de administración de Django. He estado usando la base de datos MySQL sin problema. Soy nuevo en PostgreSQL, pero decidí cambiar porque el host que finalmente planeo usar para este proyecto no tiene MySQL.Conexión de Django a PostgreSQL: "Error de autenticación de pares"

Por lo tanto, pensé que podría pasar por el proceso de instalación de PostgreSQL, ejecutar un syncdb y estar todo listo.

El problema es que parece que mi aplicación no se puede conectar a la base de datos. Puedo iniciar sesión en PostgreSQL a través de la línea de comandos o la aplicación de escritorio que descargué. Simplemente no en el guion.

Además, puedo usar manage.py shell para acceder al db bien.

¿Alguna idea?

Respuesta

187

Eché un vistazo a la excepción, noté que tenía que ver con mi configuración de conexión. Volví a settings.py, y vi que no tenía una configuración de host. Agregue localhost y listo.

Mi settings.py no tenía un HOST para la base de datos MySQL, pero necesitaba agregar uno para que PostgreSQL funcionara.

En mi caso, agregué localhost a la configuración HOST y funcionó.

Aquí está la sección DATABASES de mi settings.py.

DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.postgresql_psycopg2', 
     'NAME': '<MYDATABASE>', 
     'USER': '<MYUSER>', 
     'PASSWORD': '<MYPASSWORD>', 
     'HOST': 'localhost', # the missing piece of the puzzle 
     'PORT': '', # optional, I don't need this since I'm using the standard port 
    } 
} 
+5

se podría considerar mover la solución de su pregunta para su respuesta (y aceptarla). De esta manera, la pregunta seguirá siendo una pregunta y habrá proporcionado una respuesta adecuada. Por cierto: ¡buen trabajo! :-) –

+0

Haré. Gracias. –

+0

Tropezamos con el mismo problema con Rails 3 y su sugerencia solucionó el problema. ¡Aclamaciones! – Marco

6

i fijo esto editando la parte inferior de /etc/postgres/9.1/main/pg_hba.conf a ser (cambiando MD5 a confiar, tenga en cuenta que esto significa que no habrá contraseña de base de datos, que puede no ser lo desea)

# TYPE DATABASE USER  CIDR-ADDRESS   METHOD 

# "local" is for Unix domain socket connections only 
local all   all        trust 
# IPv4 local connections: 
host all   all   127.0.0.1/32   trust 
# IPv6 local connections: 
host all   all   ::1/128    trust 
13

Mejor que la plena confianza es solo configurarlo en md5.

# "local" is for Unix domain socket connections only 
local all   all       md5 
+4

+1; pero tenga en cuenta que md5 es en general (ligeramente) mejor que la contraseña, ya que enviará un hash en lugar de una contraseña. (Cuando es local, no importa mucho, pero si lo hace a través de la red con posibles espías es significativo.) –

+0

Si PostgreSQL no elimina los hash de contraseñas, y no sé si lo hace o no, entonces cualquiera sofisticado lo suficiente como para escuchar realmente su conexión probablemente ejecute su hash a través de una tabla de arcoíris y rompa su seguridad de todos modos. –

+0

"md5" es mejor que "confianza", pero lo mejor es usar "pares" y crear un usuario de Linux sin permisos de inicio de sesión, solo para conexiones locales. De esta manera, debe proporcionar su contraseña de root para acceder al db desde local. –

18

Eso es probablemente porque la secuencia de comandos se ejecuta en algún otro usuario que el que está intentando conectar con (miUsuario aquí). En este caso, la autenticación de pares fallará. Su solución con HOST: "localhost" funciona porque ya no está utilizando la autenticación de pares. Sin embargo, es más lento que HOST: "" porque en lugar de usar conectores Unix, usa conexiones TCP. De django docs:

Si está utilizando PostgreSQL, por defecto (HOST vacío), la conexión a la base de datos se realiza a través de conectores de dominio UNIX (líneas ‘locales’ en pg_hba.conf). Si desea conectarse a través de sockets TCP, configure HOST en 'localhost' o '127.0.0.1' ('host' en pg_hba.conf). En Windows, siempre debe definir HOST, ya que los sockets de dominio UNIX no están disponibles en .

Si desea seguir utilizando tomas de corriente, se necesitan las configuraciones correctas en pg_hba.conf.El más simple es:

local all   all        trust 

al comentar todas las demás local líneas en la configuración. Tenga en cuenta que es necesario volver a cargar postgres para que este cambio surta efecto.

Pero si está en duda la máquina de producción multiusuario, es posible que desee utilizar algo más seguro como md5 (consulte here para obtener una explicación de varios métodos de autenticación).

+1

Esto debería ser el anwer ... (más documentos, más explicaciones) – ThePhi

3

Acabo de tropezar con el mismo problema pero quería usar unix sockets como dijo clime, pero al seguir usando el método peer. Mapeé mi nombre de usuario del sistema con el nombre de usuario postgres dentro del pg_hba.conf, que está trabajando con el método peer.

Dentro pg_hba.conf añadí:

local all all peer map=map-name 

Dentro pg_ident.conf añadí:

map-name mysystem-username mypostgres-username 
Cuestiones relacionadas