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?
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
}
}
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).
Mieux que confiance totale est simplement de le définir sur md5.
# "local" is for Unix domain socket connections only
local all all md5
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
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