webentwicklung-frage-antwort-db.com.de

verbinden Sie sich mit psycopg2 ohne Kennwort mit einer Datenbank

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.

40
Pablo

Ü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.

12
okm

Ü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.

57
joerick

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;'
24
b_dev

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).


Verbindung über 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.


Verbindung über Unix-Domain-Socket

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!

3
jojo

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
0
mirek