Connexion Django à PostgreSQL: "L'authentification homologue a échoué"

121
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

C'est l'erreur que je reçois lorsque j'essaye d'accéder à mon site d'administration Django. J'avais utilisé la base de données MySQL sans problème. Je suis nouveau dans PostgreSQL, mais j'ai décidé de changer parce que l'hôte que je prévois finalement d'utiliser pour ce projet n'a pas MySQL.

Par conséquent, j'ai pensé que je pourrais passer par le processus d'installation de PostgreSQL, exécuter un syncdbet être prêt.

Le problème est que je n'arrive pas à faire en sorte 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. Mais pas dans le script.

En outre, je peux utiliser manage.py shellpour accéder à la base de données très bien.

Des pensées?

Le maître brasseur
la source

Réponses:

219

J'ai jeté un coup d'œil à 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 localhostet voilà.

Mon settings.py n'avait pas de base de données HOST pour MySQL, mais j'avais besoin d'en ajouter un pour que PostgreSQL fonctionne.

Dans mon cas, j'ai ajouté localhostau HOSTparamètre et cela a fonctionné.

Voici la DATABASESsection 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
    } 
}
Le maître brasseur
la source
5
vous pourriez envisager de déplacer la solution de votre question vers votre réponse (et de l'accepter). De cette façon, la question restera une question et elle aura correctement fourni la réponse. BTW: bon travail! :-)
Piotr Nowicki
3
J'ai eu le même problème avec une application Rails, et c'était la même solution - l'hôte devait être configuré dans config/database.yml- c'est-à-dire dans ce fichier, j'avais besoin d'ajouter la ligne host: localhost(ou où que vous soyez sur le serveur postgres - le mien était local)
jefflunt
7
Lorsque l'hôte est vide, Django tente de se connecter à la base de données à l'aide de sockets UNIX. En revanche, lorsque l'hôte est "localhost", il se connecte via TCP / IP à 127.0.0.1. Probablement, votre pg_hba.confest configuré pour empêcher les utilisateurs ordinaires de se connecter via des sockets UNIX mais les autorise via TCP / IP à partir de l'hôte local.
Jim Garrison
3
La documentation ( docs.djangoproject.com/en/1.6/ref/settings/#host ) se trouve: "HOST [...] Une chaîne vide signifie localhost". Ce n'est pas vrai, j'ai eu le même problème et je l'ai corrigé en écrivant «localhost». Merci pour le tuyau.
Marco Sulla
1
Ah HA! Je savais que je connaissais le mot de passe. Mezzanine produit un local_settings.pyfichier et le # Set to empty string for localhost. Not used with sqlite3.est dans leur. MENSONGE !!!
teewuane
24

C'est probablement parce que votre script s'exécute sous un autre utilisateur que celui avec lequel vous essayez de vous connecter ( myuser ici). Dans ce cas, l'authentification du pair échouera. Votre solution HOST: "localhost"fonctionne car 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 des connexions TCP. À partir de django docs :

Si vous utilisez PostgreSQL, par défaut (HOST vide), la connexion à la base de données se fait via les sockets de domaine UNIX (lignes 'locales' dans pg_hba.conf). Si vous souhaitez vous connecter via des sockets TCP, 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, des paramètres corrects pg_hba.confsont nécessaires. Le plus simple est:

local   all         all                               trust

tout en commentant toutes les autres locallignes de la configuration. Notez que le rechargement de postgres est nécessaire pour que cette modification prenne effet.

Mais si une machine de production multi-utilisateur est en question, 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).

climat
la source
15

Mieux que faire entièrement confiance, il suffit de le définir sur md5.

# "local" is for Unix domain socket connections only
local   all         all                           md5
Houman
la source
6
+1; mais notez que md5 est en général (légèrement) meilleur que password car il enverra un hachage par opposition à un mot de passe. (En local, cela n'a pas beaucoup d'importance; mais si vous le faites sur le réseau avec d'éventuelles écoutes indiscrètes, c'est important.)
dr jimbob
Si PostgreSQL ne salit pas les hachages de mots de passe - et je ne sais pas si c'est le cas ou non - alors toute personne suffisamment sophistiquée pour réellement écouter votre connexion va probablement exécuter votre hachage à travers une table arc-en-ciel et briser votre sécurité de toute façon.
Lyndsy Simon
1
"md5" est meilleur que "trust", mais le mieux est d'utiliser "peer" et de créer un utilisateur Linux sans droits de connexion, pour les connexions locales uniquement. De cette façon, vous devez fournir votre mot de passe root pour accéder à la base de données depuis local.
Marco Sulla
6

J'ai corrigé cela en modifiant le bas de /etc/postgres/9.1/main/pg_hba.conf pour être (en changeant md5 en confiance; REMARQUE cela signifie qu'il n'y aura pas de mot de passe de base de données, ce qui peut 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
vish
la source
5

Je suis juste tombé sur le même problème mais je voulais utiliser des sockets Unix comme l'a dit Clime, mais en utilisant toujours la peerméthode. J'ai mappé mon nom d'utilisateur système avec le nom d'utilisateur postgres dans le pg_hba.conf, qui fonctionne avec la peerméthode.

À l'intérieur, pg_hba.confj'ai ajouté:

local all all peer map=map-name

À l'intérieur, pg_ident.confj'ai ajouté:

map-name mysystem-username mypostgres-username
vu
la source