894 votes

Obtention d'une erreur : Peer authentication failed for user "postgres", lorsque l'on essaie de faire fonctionner pgsql avec rails.

Je reçois l'erreur :

FATAL: Peer authentication failed for user "postgres"

quand j'essaie de faire fonctionner postgres avec Rails.

Voici mon pg_hba.conf , mon database.yml et un vidage de la trace complète .

J'ai changé l'authentification en md5 dans pg_hba et essayé différentes choses, mais aucune ne semble fonctionner.

J'ai également essayé de créer un nouvel utilisateur et une nouvelle base de données comme indiqué dans le tableau ci-dessous. Rails 3.2, FATAL : L'authentification par les pairs a échoué pour l'utilisateur (PG::Error)

Mais ils n'apparaissent pas sur pgadmin ou même lorsque j'exécute le programme. sudo -u postgres psql -l .

Vous savez où je me trompe ?

1 votes

1) : Assurez-vous que vous avez créé un utilisateur nommé "postgres" et que vous avez les droits sur votre base de données. 2) : Assurez-vous qu'il a un mot de passe 3) : Assurez-vous que votre config/database.yml contient les informations d'identification des droits (nom d'utilisateur + mot de passe).

2 votes

Il faut que chaque endroit soit pair et que l'indentation soit réglée sur md5

18 votes

Voir également cette réponse - la connexion peut échouer sur localhost mais réussissent sur 127.0.0.1 .

5voto

Veuillez suivre les étapes suivantes

1). Tout d'abord, accédez au répertoire /etc/postgresql/{votre version de pg}/main.

Ma version est 10 Puis :

cd /etc/postgresql/10/main

2). Ici réside le fichier pg_hba.conf qui a besoin d'être modifié. accès sudo pour cela.

sudo nano pg_hba.conf

3). Faites défiler le fichier jusqu'à ce que vous trouviez ceci -

# Database administrative login by Unix domain socket
local   all             postgres                                peer

4). Ici, changez le peer en md5 comme suit.

# Database administrative login by Unix domain socket
local   all             all                                md5
  • peer signifie qu'il fera confiance à l'authenticité de l'utilisateur UNIX, donc ne

  • demander le mot de passe. md5 signifie qu'il demandera toujours un mot de passe, et le validera après le hachage avec MD5.

5) Sauvegardez maintenant le fichier et redémarrez le serveur Postgres.

sudo service postgresql restart

Maintenant ça devrait être bon.

5voto

Mazen Ora Points 71

La commande ci-dessous fonctionne pour moi :

psql -d myDb -U username -W

4voto

Pg_config est pour les informations de compilation, pour aider les extensions et les programmes clients à compiler et à lier contre PostgreSQL. Il ne sait rien de l'instance ou des instances PostgreSQL actives sur la machine, seulement les binaires.

pg_hba.conf peut apparaître à de nombreux autres endroits selon la façon dont Pg a été installé. L'emplacement standard est pg_hba.conf dans le répertoire data_directory de la base de données (qui pourrait être dans /home, /var/lib/pgsql, /var/lib/postgresql/[version]/, /opt/postgres/, etc etc etc) mais les utilisateurs et les empaqueteurs peuvent le mettre où ils veulent. Malheureusement.

Les seuls moyens valables de trouver pg_hba.conf est de demander à une instance PostgreSQL en cours d'exécution où se trouve son pg_hba.conf, ou de demander au sysadmin où il se trouve. Vous ne pouvez même pas compter sur le fait de demander où se trouve le datadir et d'analyser postgresql.conf parce qu'un init script pourrait passer un paramètre comme -c hba_file=/some/other/path lors du démarrage de Pg.

Ce que vous voulez faire, c'est demander à PostgreSQL :

SHOW hba_file;

Cette commande doit être exécutée sur une session super-utilisateur, donc pour un script shell vous pourriez écrire quelque chose comme :

psql -t -P format=unaligned -c 'show hba_file';

et définissez les variables d'environnement PGUSER, PGDATABASE, etc. pour vous assurer que la connexion est correcte.

Oui, c'est un peu le problème de la poule et de l'œuf, dans la mesure où si l'utilisateur ne peut pas se connecter (disons, après avoir fait une erreur en éditant pg_hba.conf), vous ne pouvez pas trouver pg_hba.conf pour le corriger.

Une autre option est de regarder la sortie de la commande ps et de voir si l'argument -D du répertoire de données du postmaster y est visible, par ex.

ps aux  | grep 'postgres *-D'

puisque pg_hba.conf se trouvera dans le répertoire des données (sauf si vous êtes sous Debian/Ubuntu ou un dérivé et que vous utilisez leurs paquets).

Si vous ciblez spécifiquement les systèmes Ubuntu avec PostgreSQL installé à partir de paquets Debian/Ubuntu, cela devient un peu plus facile. Vous n'avez pas à vous occuper de Pg compilé à la main à partir des sources et pour lequel quelqu'un a créé un datadir dans son répertoire personnel, ou d'une installation de Pg EnterpriseDB dans /opt, etc. Vous pouvez demander à pg_wrapper, le gestionnaire Pg multi-version de Debian/Ubuntu, où se trouve PostgreSQL en utilisant la commande pg_lsclusters de pg_wrapper.

Si vous ne pouvez pas vous connecter (Pg ne fonctionne pas ou vous devez modifier pg_hba.conf pour vous connecter), vous devrez rechercher les fichiers pg_hba.conf sur le système. Sur Mac et Linux, quelque chose comme sudo find / -type f -name pg_hba.conf fera l'affaire. Vérifiez ensuite le fichier PG_VERSION dans le même répertoire pour vous assurer qu'il s'agit de la bonne version de PostgreSQL si vous en avez plusieurs. (Si pg_hba.conf est dans /etc/, ignorez ceci, c'est le nom du répertoire parent à la place). Si vous avez plus d'un répertoire de données pour la même version de PostgreSQL, vous devrez regarder la taille de la base de données, vérifier la ligne de commande du postgres en cours d'exécution à partir de ps pour voir si l'argument -D du répertoire de données correspond à celui que vous éditez, etc. https://askubuntu.com/questions/256534/how-do-i-find-the-path-to-pg-hba-conf-from-the-shell/256711

4voto

alramdein Points 423

La plupart des solutions suggèrent de modifier le pg_hba.conf .

Pour ceux qui ne souhaitent pas modifier le fichier de configuration, il suffit de se connecter à l'interface de l'entreprise. postgres utilisateur. Si vous utilisez/serveur Linux, utilisez cette commande

sudo -i -u postgres

Il va créer un utilisateur postgres puis connectez-vous à celui-ci. Essayez à nouveau votre commande psql.

Vous pouvez également ajouter postgres utilisateur un mot de passe avec la commande : (vous devez être dans l'utilisateur Root)

passwd postgres

Cela fonctionne car selon cette Documentation de PostgreSQL ,

Authentification par les pairs

La méthode d'authentification par les pairs fonctionne en obtenant le nom d'utilisateur du système d'exploitation du client à partir de la base de données du système d'exploitation. du client et en l'utilisant comme nom d'utilisateur de la base de données nom d'utilisateur de la base de données (avec mappage facultatif du nom d'utilisateur). Cette méthode n'est Cette méthode n'est prise en charge que pour les connexions locales.

3voto

Bill Points 64

La plupart des autres réponses concernent les paramètres des différents fichiers de configuration, et celles qui concernent l'option pg_hba.conf s'appliquent et sont 100% correctes. Cependant, assurez-vous que vous êtes modifier les bons fichiers de configuration .

Comme d'autres l'ont mentionné, les emplacements des fichiers de configuration peuvent être remplacés par divers paramètres dans le fichier de configuration principal, ainsi que par la fourniture d'un chemin d'accès au fichier de configuration principal sur la ligne de commande avec la fonction -D option.

Vous pouvez utiliser la commande suivante lors d'une session psql pour montrer où vos fichiers de configuration sont lus (en supposant que vous pouvez lancer psql). Il s'agit simplement d'une étape de dépannage qui peut aider certaines personnes :

select * from pg_settings where setting~'pgsql';  

Vous devez également vous assurer que le répertoire de base de votre utilisateur postgres se trouve là où vous l'attendez. Je dis cela parce qu'il est assez facile de négliger ce point, étant donné que votre invite affichera ' ~ au lieu du chemin réel de votre répertoire personnel, ce qui n'est pas si évident. Dans de nombreuses installations, le répertoire personnel de l'utilisateur de postgres prend par défaut la valeur suivante /var/lib/pgsql .

S'il n'est pas défini comme il devrait l'être, arrêtez le service postgresql et utilisez la commande suivante en vous connectant en tant que Root. Assurez-vous également que l'utilisateur postgres n'est pas connecté à une autre session :

usermod -d /path/pgsql postgres

Enfin, assurez-vous que votre variable PGDATA est correctement définie en tapant echo $PGDATA qui devrait donner quelque chose de similaire :

/path/pgsql/data

S'il n'est pas défini, ou s'il affiche quelque chose de différent de ce que vous attendez, examinez vos fichiers de démarrage ou RC tels que .profile ou .bash.rc - cela variera grandement en fonction de votre OS et de votre shell. Une fois que vous avez déterminé le script de démarrage correct pour votre machine, vous pouvez insérer ce qui suit :

export PGDATA=/path/pgsql/data

Pour mon système, je l'ai placé dans /etc/profile.d/profile.local.sh afin qu'il soit accessible à tous les utilisateurs.

Vous devriez maintenant être en mesure d'initier la base de données comme d'habitude et tous vos paramètres de chemin psql devraient être corrects !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X