Ich habe eine Postgres-Datenbank auf meinem localhost, auf die ich ohne Passwort zugreifen kann
$ psql -d mwt
psql (8.4.12)
Type "help" for help.
mwt=# SELECT * from vatid;
id | requester_vatid |...
-----+-----------------|...
1719 | IT00766780266 |...
Ich möchte von Django aus auf diese Datenbank zugreifen. Also habe ich in DATABASES
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'mwt',
'USER': 'shaoran',
'Host': 'localhost'
}
}
Da ich für den Zugriff auf meine Testdatenbank kein Passwort benötige, habe ich in den Einstellungen keinen PASSWORD
-Wert angegeben.
$ ./manage.py Shell
>>> from polls.models import Vatid
>>> Vatid.objects.all()
connection_factory=connection_factory, async=async)
OperationalError: fe_sendauth: no password supplied
Ich habe versucht, PASSWORD: ''
zu verwenden, erhalte aber dieselbe Fehlermeldung. Ich habe versucht, PASSWORD: None
zu verwenden, aber das half auch nicht.
Ich habe die Django-Dokumentation dazu durchsucht, aber ich kann nichts Nützliches finden. Es ist möglich, Django.db.backends.postgresql_psycopg2
so zu konfigurieren, dass ein leeres Passwort akzeptiert wird.
Überprüfen Sie Ihren pg_hba.conf
, um die Verbindung von localhost
durch den Benutzer shaoran
zuzulassen, geben Sie dann entweder das Kennwort von shaoran
in den Django-Einstellungen an oder vertrauen Sie dem Benutzer in pg_hba.conf
Die Tatsache, dass Sie über psql
eine Verbindung herstellen können, liegt daran, dass psql -d mwt
einige Standardverbindungswerte verwendet, die in pg_hba.conf
als vertrauenswürdig festgelegt sind. Auf meinem Rechner ist der Standardhost beispielsweise local socket
anstelle von localhost
.
Überraschenderweise lautet die Antwort, keinen Host anzugeben. Wenn du das tust,
DATABASES = {
'default': {
'ENGINE': 'Django.db.backends.postgresql_psycopg2',
'NAME': 'mwt',
}
}
Dann verbindet sich psycopg2 mit einem Unix-Socket auf dieselbe Weise wie psql
. Wenn Sie eine Host
angeben, verbindet sich psycopg2 mit TCP/IP, für das ein Kennwort erforderlich ist.
Um die Verwendung eines Passworts in Django settings.py
zu vermeiden, ändern Sie md5
in trust
in dieser Zeile von pg_hba.conf
:
Host all all 127.0.0.1/32 trust
Für ein detailliertes Verständnis der Sicherheitskonfigurationen von Postgres lesen Sie dieses Dokument.
So finden Sie diese Datei:
Sudo -u postgres psql -c 'SHOW hba_file;'
Da sich jemand mit demselben Problem konfrontiert hat und erst nach dem Kombinieren verschiedener Teile aus den hier vorliegenden Antworten und anderen Erkenntnissen aus google-ing-Versuchen eine Lösung gefunden hat, entschied ich mich, eine hoffentlich vollständige Antwort zusammenzustellen:
Das Erste, was Sie beachten sollten:
Sowohl das Einfügen von 'Host'
als auch das Weglassen in settings.py
sind mögliche Optionen. Ob Sie jedoch 'Host'
eingeben, beeinflusst, wie Sie die Postgresql-Konfiguration einrichten müssen.
Das Auslassen von 'Host'
in joericks Antwort führt dazu, dass psycopg2 versucht, eine Verbindung über den Unix-Domänensocket herzustellen. Wenn Ihre Konfiguration jedoch den Schlüssel 'Host'
enthält, versucht psycopg2, eine Verbindung über IPv4/6 localhost
herzustellen. Dies macht einen großen Unterschied, da die Konfiguration der Postgresql-Authentifizierung (/etc/postgresql/x.x/main/pg_hba.conf
) für beide Verbindungsarten spezifisch ist.
Nachricht nach Hause nehmen:
Stellen Sie sicher, dass Sie den Verbindungstyp auswählen, den Sie auch in Ihrer Postgresql-Authentifizierungskonfiguration konfiguriert haben.
Zweites zu beachten:
Die Postgresql-Authentifizierungskonfiguration (/etc/postgresql/x.x/main/pg_hba.conf
) kümmert sich um die Reihenfolge der Einträge.
Die docs sind eigentlich sehr klar, (ich habe es trotzdem geschafft, in die local all all peer
-Falle zu fallen):
Der Datensatz first mit einem übereinstimmenden Verbindungstyp, einer Clientadresse, der angeforderten Datenbank und einem Benutzernamen wird zur Authentifizierung verwendet. Es gibt kein "Durchfallen" oder "Sichern": Wenn ein Datensatz ausgewählt wird und die Authentifizierung fehlschlägt, werden nachfolgende Datensätze nicht berücksichtigt. Wenn kein Datensatz übereinstimmt, wird der Zugriff verweigert.
Nachricht nach Hause nehmen:
Stellen Sie sicher, dass eine bestimmte Regel vor breiteren Regeln kommt.
Nun, da wir all das wissen, ist hier, wie man Zugang ohne Passwort erhält, einmal mit 'Host'
(also über localhost
) und einmal ohne (so über Unix-Socket).
localhost
Geben Sie 'Host': 'localhost'
in der Datenbankkonfiguration Ihres settings.py
an:
# ...
'Host': 'localhost',
# ...
'PASSWORD'
wird nicht benötigt und kann weggelassen werden.
Die Regel, die Sie in Ihrer Postgresql-Authentifizierungskonfiguration (/etc/postgresql/x.x/main/pg_hba.conf
) festlegen müssen, gilt für TYPE Host
.
Beachten Sie die Reihenfolge der Regeln. Wenn Sie also einen Benutzer 'my_user' haben, der ohne Passwort auf die Datenbank 'my_database' zugreifen kann, würde eine korrekte Konfiguration folgendermaßen aussehen:
# RIGHT WAY...
Host my_database my_user 127.0.0.1/32 trust
Host my_database my_user ::1/128 trust
# ...
Host all all 127.0.0.1/32 peer
# ...
Die Umkehrung der Bestellung führt zu einem no password supplied
-Fehler.
Geben Sie den 'Host'
-Schlüssel nicht in Ihre Einstellungen ein 'PASSWORD'
wird auch nicht benötigt.
In der Postgresql-Authentifizierungskonfiguration wird der Zugriff über Unix-Domänensockets mit Regeln von TYPE local
verwaltet.
Wenn "my_user" vertrauenswürdig sein soll (kein Kennwort erforderlich), Zugriff auf eine Datenbank "my_database", benötigen Sie eine Zeile wie diese:
local my_database my_user trust
In Bezug auf die Stelle, an der diese Zeile eingefügt werden soll, ist die Regel, dass Sie sie vor jede wide - Regel in Form von DATABASE
und USER
setzen müssen. Um sicherzugehen, empfehle ich, es am Beginn von /etc/postgresql/x.x/main/pg_hba.conf
zu platzieren. Wenn Ihre pg_hba.conf
-Datei so aussieht:
# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...
sie können ohne Passwort gehen. Wenn es jedoch so aussieht:
# WRONG WAY! ...
local all all peer
# ...
local my_database my_user trust
# ...
sie müssen ein Passwort angeben.
Schlussnote:
Vergessen Sie nicht, den Postgresql-Dienst nach der Änderung von /etc/postgresql/x.x/pg_hba.conf
neu zu starten:
Sudo service postgresql restart
Ich hoffe das war hilfreich. Viel Spaß beim Codieren!
Ich lebe nur bei "local all all peer". Die Verbindungszeichenfolge sollte ohne Host, Benutzer und Kennwort lauten: postgres: /// mydbname.
Ohne Umgebungsmodul sieht es so aus:
DATABASES = {
'default': {'NAME': 'mydatabase', 'USER': '', 'PASSWORD': '', 'Host': '', 'PORT': '', 'ENGINE': 'Django.db.backends.postgresql_psycopg2'}
}
Mit Umgebungsmodul:
import environ
env = environ.Env()
DATABASES = {
'default': env.db('DATABASE_URL', default='postgres:///mydatabase'),
}
die .env-Datei enthält keine DATABASE_URL-Einstellung.
Nur für Benutzer 'postgres' verwende ich md5, aber nur aus psql/pgadmin3, nicht aus Django-Code.
# /etc/postgresql/version/cluster/pg_hba.conf:
local all postgres md5
local all all peer