Connessione Django a PostgreSQL: "Autenticazione peer non riuscita"


121
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Questo è l'errore che ricevo quando provo ad accedere al mio sito di amministrazione di Django. Ho utilizzato il database MySQL senza problemi. Sono nuovo in PostgreSQL, ma ho deciso di cambiare perché l'host che alla fine intendo utilizzare per questo progetto non ha MySQL.

Pertanto, ho pensato di poter eseguire il processo di installazione di PostgreSQL, eseguire un syncdbed essere pronto.

Il problema è che non riesco a far sì che la mia app si connetta al database. Posso accedere a PostgreSQL tramite la riga di comando o l'app desktop che ho scaricato. Solo non nel copione.

Inoltre, posso usare manage.py shellper accedere al db bene.

qualche idea?

Risposte:


219

Ho dato un'occhiata all'eccezione, ho notato che aveva a che fare con le mie impostazioni di connessione. Sono tornato a settings.py e ho visto che non avevo una configurazione host. Aggiungi localhoste voilà.

Il mio settings.py non aveva un HOST per il database MySQL, ma avevo bisogno di aggiungerne uno per far funzionare PostgreSQL.

Nel mio caso, ho aggiunto localhostal fileHOST impostazione e ha funzionato.

Ecco la DATABASESsezione dal mio 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
potresti considerare di spostare la soluzione dalla tua domanda alla tua risposta (e accettarla). In questo modo, la domanda rimarrà una domanda e avrà una risposta adeguata. BTW: buon lavoro! :-)
Piotr Nowicki

3
Ho avuto lo stesso problema con un'app Rails, ed era la stessa soluzione - l'host doveva essere configurato config/database.yml- vale a dire, in quel file avevo bisogno di aggiungere la linea host: localhost(o dovunque tu sia il server postgres - il mio era locale)
Jefflunt

7
Quando l'HOST è vuoto, Django tenta di connettersi al database utilizzando i socket UNIX. D'altra parte, quando l'HOST è "localhost", si connette tramite TCP / IP a 127.0.0.1. Probabilmente, il tuo pg_hba.confè impostato per negare agli utenti ordinari di connettersi tramite socket UNIX ma consente loro su TCP / IP da localhost.
Jim Garrison

3
La documentazione ( docs.djangoproject.com/en/1.6/ref/settings/#host ) si trova: "HOST [...] Una stringa vuota significa localhost". Questo non è vero, ho avuto lo stesso problema e l'ho risolto scrivendo "localhost". Grazie per il suggerimento.
Marco Sulla

1
Ah HA! Sapevo di CONOSCERE la password. Mezzanine produce un local_settings.pyfile e il file # Set to empty string for localhost. Not used with sqlite3.è nel file . BUGIE!!!
teewuane

24

Ciò è probabilmente dovuto al fatto che il tuo script è in esecuzione con un utente diverso da quello con cui stai tentando di connetterti ( mioutente qui). In questo caso, l'autenticazione peer fallirà. La tua soluzione con HOST: "localhost"funziona perché non stai più utilizzando l'autenticazione peer. Tuttavia, è più lento che HOST: ""perché invece di utilizzare socket Unix, si utilizzano connessioni TCP. Da django docs :

Se stai usando PostgreSQL, per impostazione predefinita (HOST vuoto), la connessione al database viene effettuata tramite socket di dominio UNIX (righe "locali" in pg_hba.conf). Se desideri connetterti tramite socket TCP, imposta HOST su "localhost" o "127.0.0.1" (righe "host" in pg_hba.conf). Su Windows, dovresti sempre definire HOST, poiché i socket di dominio UNIX non sono disponibili.

Se si desidera continuare a utilizzare i socket, pg_hba.confsono necessarie le impostazioni corrette in . Il più semplice è:

local   all         all                               trust

commentando tutti gli altri local righe nel file config. Tieni presente che è necessario ricaricare postgres affinché questa modifica abbia effetto.

Ma se la macchina di produzione multiutente è in questione, potresti voler usare qualcosa di più sicuro come md5(vedi qui per la spiegazione dei vari metodi di autenticazione).


15

Meglio che fidarsi completamente è semplicemente impostarlo su md5.

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

6
+1; ma nota che md5 è in generale (leggermente) migliore della password in quanto invierà un hash invece di una password. (Quando è locale non importa molto, ma se lo si fa in rete con possibili intercettatori è significativo.)
dr jimbob

Se PostgreSQL non sale gli hash delle password - e non so se lo fa o no - allora chiunque sia abbastanza sofisticato da intercettare effettivamente la tua connessione probabilmente eseguirà il tuo hash attraverso una tabella arcobaleno e infrangerà comunque la tua sicurezza.
Lyndsy Simon,

1
"md5" è meglio di "trust", ma la cosa migliore è usare "peer" e creare un utente Linux senza permessi di accesso, solo per connessioni locali. In questo modo devi fornire la tua password di root per accedere al database da locale.
Marco Sulla

6

Ho risolto il problema modificando la parte inferiore di /etc/postgres/9.1/main/pg_hba.conf in modo che fosse (cambiando md5 in trust; NOTA questo significa che non ci sarà alcuna password del database, che potrebbe non essere quella che desideri)

# 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

5

Mi sono appena imbattuto nello stesso problema ma volevo usare i socket unix come ha detto clime, ma usando ancora il peermetodo. Ho mappato il mio nome utente di sistema con il nome utente postgres all'interno di pg_hba.conf, che funziona con il filepeer metodo.

All'interno pg_hba.confho aggiunto:

local all all peer map=map-name

All'interno pg_ident.confho aggiunto:

map-name mysystem-username mypostgres-username
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.