web-dev-qa-db-fra.com

Django connexion à PostgreSQL: "L'authentification entre homologues a échoué"

OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

C’est l’erreur que je reçois lorsque j’essaie d’obtenir mon Django site admin.). J’utilisais la base de données MySQL sans problème. Je suis nouveau dans PostgreSQL, mais j’ai décidé de changer finalement, envisagez d'utiliser pour ce projet n'a pas MySQL.

Par conséquent, j’ai pensé que je pourrais suivre le processus d’installation de PostgreSQL, lancer un syncdb et être complet.

Le problème est que je n'arrive pas à obtenir que mon application se connecte à la base de données. Je peux me connecter à PostgreSQL via la ligne de commande ou l'application de bureau que j'ai téléchargée. Juste pas dans le script.

De plus, je peux utiliser manage.py Shell pour accéder à la base de données très bien.

Des pensées?

114
The Brewmaster

J'ai jeté un coup d'oeil à l'exception, j'ai remarqué que cela avait à voir avec mes paramètres de connexion. Je suis retourné à settings.py et j'ai vu que je n'avais pas de configuration d'hôte. Ajoutez localhost et le tour est joué.

Mon fichier settings.py ne possédait pas de base de données Host for MySQL, mais je devais en ajouter une pour que PostgreSQL puisse fonctionner.

Dans mon cas, j'ai ajouté localhost au paramètre Host et cela a fonctionné.

Voici la section DATABASES de mon 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
    } 
}
210
The Brewmaster

C'est probablement parce que votre script est exécuté sous un utilisateur autre que celui avec lequel vous essayez de vous connecter ( myuser ici). Dans ce cas, l'authentification par les pairs échouera. Votre solution avec Host: "localhost" fonctionne parce que vous n'utilisez plus l'authentification par les pairs. Cependant, il est plus lent que Host: "" parce qu’au lieu d’utiliser des sockets unix, vous utilisez TCP connexions. À partir de Django docs :

Si vous utilisez PostgreSQL, par défaut (hôte vide), la connexion à la base de données est établie via des sockets de domaine UNIX (lignes ‘locales’ dans pg_hba.conf). Si vous souhaitez vous connecter via TCP sockets, définissez Host sur 'localhost' ou '127.0.0.1' (lignes 'Host' dans pg_hba.conf). Sous Windows, vous devez toujours définir Host, car les sockets de domaine UNIX ne sont pas disponibles.

Si vous souhaitez continuer à utiliser les sockets, corrigez les paramètres dans pg_hba.conf sont nécessaires. Le plus simple est:

local   all         all                               trust

en commentant toutes les autres lignes local de la configuration. Notez que le rechargement de postgres est nécessaire pour que cette modification soit prise en compte.

Mais si une machine de production multi-utilisateur est en cause, vous voudrez peut-être utiliser quelque chose de plus sécurisé, comme md5 _ (voir ici pour une explication des différentes méthodes d'authentification).

20
clime

Mieux que confiance totale est simplement de le définir sur md5.

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

J'ai corrigé cela en modifiant le bas de /etc/postgres/9.1/main/pg_hba.conf pour qu'il soit (changer md5 en confiance; NOTE: cela signifie qu'il n'y aura pas de mot de passe de base de données, ce qui pourrait ne pas être ce que vous voulez).

# 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
6
vish

Je suis tombé sur le même problème, mais je voulais utiliser des sockets unix comme le dit Clime, mais en utilisant toujours la méthode peer. J'ai mappé mon nom d'utilisateur système avec le nom d'utilisateur postgres à l'intérieur du pg_hba.conf, qui utilise la méthode peer.

À l'intérieur pg_hba.conf J'ai ajouté:

local all all peer map=map-name

À l'intérieur pg_ident.conf J'ai ajouté:

map-name mysystem-username mypostgres-username
4
seeN