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

FATAL: Peer authentication failed for user "myuser" 

Questo è l'errore che sto ricevendo quando provo ad accedere al mio sito di amministrazione Django. Stavo usando il database MySQL senza problemi. Sono nuovo di PostgreSQL, ma ho deciso di cambiare perché l'host che in definitiva pianifico di utilizzare per questo progetto non ha MySQL.Connessione Django a PostgreSQL: "Autenticazione peer non riuscita"

Pertanto, ho pensato che potevo passare attraverso il processo di installazione di PostgreSQL, eseguire un syncdb e essere tutto pronto.

Il problema è che non riesco a trovare la mia app per connettersi al database. Posso accedere a PostgreSQL tramite la riga di comando o l'app desktop che ho scaricato. Solo non nella sceneggiatura.

Inoltre, posso usare manage.py shell per accedere al db bene.

Qualche idea?

risposta

187

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 localhost e voilà.

My settings.py non disponeva di un HOST per il database MySQL, ma avevo bisogno di aggiungerne uno per PostgreSQL per funzionare.

Nel mio caso, ho aggiunto localhost all'impostazione HOST e ha funzionato.

Questa è la sezione DATABASES 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

si potrebbe prevedere il passaggio alla soluzione dalla tua domanda per la risposta (e accettarla). In questo modo, la domanda rimarrà una domanda e avrà una risposta adeguata. A proposito: buon lavoro! :-) –

+0

Lo farà. Grazie. –

+0

È incappato nello stesso problema con Rails 3 e il tuo suggerimento ha risolto il problema. Saluti! – Marco

6

ho risolto modificando il fondo del /etc/postgres/9.1/main/pg_hba.conf da (cambiando md5 a fidarsi; notare che questo significa che non ci sarà alcuna password del database, che non può essere quello che vuoi)

# 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

Meglio della completa affidabilità è sufficiente impostarlo su md5.

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

+1; ma nota md5 è in generale (leggermente) migliore della password in quanto invierà un hash anziché una password. (Quando locale non importa molto, ma se lo si fa sulla rete con possibili intercettazioni è significativo.) –

+0

Se PostgreSQL non salta gli hash delle password - e non so se lo fa o no - allora chiunque sia sofisticato probabilmente per intercettare la tua connessione probabilmente eseguirai il tuo hash attraverso una tabella arcobaleno e romperesti comunque la tua sicurezza. –

+0

"md5" è meglio di "trust", ma la cosa migliore è usare "peer" e creare un utente Linux senza autorizzazioni di accesso, solo per connessioni locali. In questo modo devi fornire la tua password di root per accedere al db dal locale. –

18

Questo è probabilmente perché lo script è in esecuzione in un altro utente da quello che si sta tentando di connettersi con (myuser 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 di HOST: "" perché, invece di utilizzare socket unix, si usano connessioni TCP. Da django docs:

Se stai usando PostgreSQL, per impostazione predefinita (HOST vuoto), la connessione al il database è fatto attraverso socket di dominio UNIX (linee ‘locali’ in pg_hba.conf). Se si desidera connettersi tramite socket TCP, impostare HOST su 'localhost' o '127.0.0.1' (linee 'host' in pg_hba.conf). Su Windows, , si dovrebbe sempre definire HOST, poiché i socket di dominio UNIX non sono disponibili .

Se si desidera continuare a utilizzare le prese, sono necessarie le impostazioni corrette in pg_hba.conf.Il più semplice è:

local all   all        trust 

commentando tutte le altre linee local nella config. Si noti che è necessario ricaricare postgres affinché questa modifica abbia effetto.

Ma se la macchina di produzione multiutente è in questione, è possibile che si desideri utilizzare qualcosa di più sicuro come md5 (vedere here per la spiegazione dei vari metodi di autenticazione).

+1

Questo dovrebbe essere l'anwer ... (più documenti, più spiegazioni) – ThePhi

3

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

All'interno pg_hba.conf ho aggiunto:

local all all peer map=map-name 

All'interno pg_ident.conf ho aggiunto:

map-name mysystem-username mypostgres-username 
Problemi correlati