Connexion Django à PostgreSQL: "échec de l'authentification par les pairs"

OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

C'est l'erreur que je reçois lorsque j'essaie d'accéder à mon site d'administration de Django. J'avais utilisé la base de données MySQL sans problème. Je suis nouveau sur PostgreSQL, mais j'ai décidé de changer car 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 pouvais passer par le processus D'installation de PostgreSQL, exécuter un syncdb et être tout réglé.

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 ligne de commande ou application de bureau que j'ai téléchargée. Tout simplement pas dans le script.

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

Des idées?

111
demandé sur guaka 2011-11-17 17:08:49

5 réponses

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. Ajouter localhost et le tour est joué.

Mon settings.py Je n'avais pas D'hôte pour la base de données MySQL, mais j'avais besoin d'en ajouter un pour que PostgreSQL fonctionne.

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
    } 
}
194
répondu The Brewmaster 2017-09-18 11:05:04

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 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: "" car au lieu d'utiliser des sockets unix, vous utilisez des connexions TCP. À partir de documents django :

Si vous utilisez PostgreSQL, par défaut (hôte vide), la connexion à le la base de données se fait via des 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). Sur Windows, vous devez toujours définir HOST, car les sockets de domaine UNIX ne le sont pas disponible.

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

local   all         all                               trust

Tout en commentant toutes les autres lignes local dans la configuration. Notez que le rechargement postgres est nécessaire pour que ce changement prenne effet.

Mais si la machine de production multi-utilisateurs est en question, vous pouvez utiliser quelque chose de plus sécurisé comme md5 (Voir ici pour l'explication des différentes méthodes d'authentification).

19
répondu clime 2013-03-08 08:55:37

Mieux que la confiance totale est juste de le mettre à md5.

# "local" is for Unix domain socket connections only
local   all         all                           md5
13
répondu Houman 2012-09-23 11:10:12

J'ai corrigé cela en éditant le bas de/etc / postgres / 9.1 / main / pg_hba.conf à être (changer md5 à trust; notez que 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
6
répondu vish 2012-06-02 00:25:10

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 méthode peer. J'ai mappé mon nom d'utilisateur système avec le nom d'utilisateur postgres dans le pg_hba.conf, qui fonctionne avec 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
3
répondu seeN 2015-07-31 18:05:52