Django-Verbindung zu PostgreSQL: "Peer-Authentifizierung fehlgeschlagen"

120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Dies ist der Fehler, den ich erhalte, wenn ich versuche, zu meiner Django-Administrationsseite zu gelangen. Ich hatte MySQL-Datenbank kein Problem verwendet. Ich bin neu in PostgreSQL, habe mich aber für einen Wechsel entschieden, da der Host, den ich letztendlich für dieses Projekt verwenden möchte, nicht über MySQL verfügt.

Daher dachte ich mir, ich könnte den Prozess der Installation von PostgreSQL durchlaufen, a ausführen syncdbund fertig sein.

Das Problem ist, dass ich meine App scheinbar nicht dazu bringen kann, eine Verbindung zur Datenbank herzustellen. Ich kann mich über die von mir heruntergeladene Befehlszeile oder Desktop-App bei PostgreSQL anmelden. Nur nicht im Drehbuch.

Außerdem kann ich gut manage.py shellauf die Datenbank zugreifen.

Irgendwelche Gedanken?

Der Braumeister
quelle

Antworten:

217

Ich warf einen Blick auf die Ausnahme und bemerkte, dass dies mit meinen Verbindungseinstellungen zu tun hatte. Ging zurück zu settings.py und sah, dass ich kein Host-Setup hatte. Hinzufügen localhostund voila.

Meine settings.py hatte keinen HOST für die MySQL-Datenbank, aber ich musste einen hinzufügen, damit PostgreSQL funktioniert.

In meinem Fall habe ich localhostdie HOSTEinstellung hinzugefügt und es hat funktioniert.

Hier ist der DATABASESAbschnitt von meinem 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
    } 
}
Der Braumeister
quelle
5
Sie könnten erwägen, die Lösung von Ihrer Frage zu Ihrer Antwort zu verschieben (und sie zu akzeptieren). Auf diese Weise bleibt die Frage eine Frage und hat die richtige Antwort gegeben. Übrigens: gute Arbeit! :-)
Piotr Nowicki
3
Hatte das gleiche Problem mit einer Rails-App und es war die gleiche Lösung - der Host musste konfiguriert werden config/database.yml- das heißt, in dieser Datei musste ich die Zeile hinzufügen host: localhost(oder wo immer sich der Postgres-Server befindet - meiner war lokal).
Jefflunt
7
Wenn der Host leer ist, versucht Django, über UNIX-Sockets eine Verbindung zur Datenbank herzustellen. Wenn der Host jedoch "localhost" ist, stellt er über TCP / IP eine Verbindung zu 127.0.0.1 her. Wahrscheinlich ist Ihr System pg_hba.confso eingerichtet, dass normale Benutzer keine Verbindung über UNIX-Sockets herstellen können, diese jedoch über TCP / IP von localhost aus zugelassen werden.
Jim Garrison
3
Die Dokumentation ( docs.djangoproject.com/de/1.6/ref/settings/#host ) lautet : "HOST [...] Eine leere Zeichenfolge bedeutet localhost". Dies ist nicht wahr, ich hatte das gleiche Problem und habe es behoben, indem ich 'localhost' geschrieben habe. Danke für den Tipp.
Marco Sulla
1
Ah HA! Ich wusste, dass ich das Passwort kannte. Mezzanine erstellt eine local_settings.pyDatei und die # Set to empty string for localhost. Not used with sqlite3.ist in ihrer. LÜGEN!!!
Teewuane
23

Dies liegt wahrscheinlich daran, dass Ihr Skript unter einem anderen Benutzer als dem ausgeführt wird, mit dem Sie eine Verbindung herstellen möchten ( myuser hier). In diesem Fall schlägt die Peer-Authentifizierung fehl. Ihre Lösung mit HOST: "localhost"funktioniert, weil Sie keine Peer-Authentifizierung mehr verwenden. Es ist jedoch langsamer als HOST: ""weil Sie anstelle von Unix-Sockets TCP-Verbindungen verwenden. Aus Django-Dokumenten :

Wenn Sie PostgreSQL verwenden, erfolgt die Verbindung zur Datenbank standardmäßig (leerer HOST) über UNIX-Domänensockets ('lokale' Zeilen in pg_hba.conf). Wenn Sie eine Verbindung über TCP-Sockets herstellen möchten, setzen Sie HOST auf 'localhost' oder '127.0.0.1' ('Host'-Zeilen in pg_hba.conf). Unter Windows sollten Sie HOST immer definieren, da UNIX-Domänensockets nicht verfügbar sind.

Wenn Sie weiterhin Sockets verwenden möchten, sind die richtigen Einstellungen pg_hba.conferforderlich. Das einfachste ist:

local   all         all                               trust

während Sie alle anderen localZeilen in der Konfiguration auskommentieren. Beachten Sie, dass das erneute Laden von Postgres erforderlich ist, damit diese Änderung wirksam wird.

Aber wenn Multi-User - Produktionsmaschine in Frage, könnte man etwas sicherer wie verwenden mag md5(siehe hier zur Erläuterung der verschiedenen Authentifizierungsmethoden).

Klima
quelle
14

Besser als volles Vertrauen ist es, es einfach auf md5 zu setzen.

# "local" is for Unix domain socket connections only
local   all         all                           md5
Houman
quelle
5
+1; Beachten Sie jedoch, dass md5 im Allgemeinen (geringfügig) besser als das Kennwort ist, da es im Gegensatz zu einem Kennwort einen Hash sendet. (Wenn lokal, ist es nicht wichtig; aber wenn es über das Netzwerk mit möglichen Lauschern gemacht wird, ist es
wichtig
Wenn PostgreSQL keine Passwort-Hashes salzt - und ich weiß nicht, ob dies der Fall ist oder nicht -, wird jeder, der hoch genug ist, um Ihre Verbindung tatsächlich zu belauschen, Ihren Hash wahrscheinlich durch eine Regenbogentabelle laufen lassen und trotzdem Ihre Sicherheit beeinträchtigen.
Lyndsy Simon
"md5" ist besser als "trust", aber das Beste ist, "peer" zu verwenden und einen Linux-Benutzer ohne Anmeldeberechtigungen nur für lokale Verbindungen zu erstellen. Auf diese Weise müssen Sie Ihr Root-Passwort angeben, um von lokal auf die Datenbank zugreifen zu können.
Marco Sulla
6

Ich habe dies behoben, indem ich den unteren Rand von /etc/postgres/9.1/main/pg_hba.conf so bearbeitet habe (md5 in Vertrauen ändern; HINWEIS: Dies bedeutet, dass es kein Datenbankkennwort gibt, das möglicherweise nicht Ihren Wünschen entspricht).

# 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
vish
quelle
5

Ich bin gerade auf das gleiche Problem gestoßen, wollte aber Unix-Sockets verwenden, wie Clime sagte, aber immer noch die peerMethode verwenden. Ich habe meinen System-Benutzernamen mit dem Postgres-Benutzernamen in der verknüpft pg_hba.conf, der mit der peerMethode arbeitet.

Innen habe pg_hba.confich hinzugefügt:

local all all peer map=map-name

Innen habe pg_ident.confich hinzugefügt:

map-name mysystem-username mypostgres-username
gesehen
quelle