214 votes

psql : FATAL : L'authentification par les pairs a échoué pour l'utilisateur "dev".

Quand je crée un nouvel utilisateur, il ne peut pas se connecter à la base de données.
Je fais ça comme ça :

postgres@Aspire:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

puis créer une base de données :

postgres@Aspire:/home/XXX$ createdb -O dev test_development

après ça, j'essaie psql -U dev -W test_development pour se connecter, mais je reçois l'erreur :

psql: FATAL:  Peer authentication failed for user "dev"

J'ai essayé de résoudre le problème mais sans succès.

2 votes

1 votes

Maintenant, pour être invité à répondre aux questions ci-dessus, vous devez ajouter --interactive à la commande : createuser --interactive joe

346voto

meyerson Points 51

Essayez :

psql -U user_name  -h 127.0.0.1 -d db_name

  • -U est le nom de l'utilisateur de la base de données
  • -h est le nom d'hôte/IP du serveur local, évitant ainsi les sockets de domaine Unix.
  • -d est le nom de la base de données à laquelle se connecter

Cette connexion est alors évaluée comme une connexion "réseau" par Postgresql plutôt que comme une connexion de socket de domaine Unix, et n'est donc pas évaluée comme une connexion "locale" comme vous pourriez le voir dans l'exemple suivant pg_hba.conf :

local   all             all                                     peer

15 votes

J'avais besoin (ver 9.4) de : psql -U nom-utilisateur -h 127.0.0.1 -d db-name

9 votes

Quel outil méchant. Le manuel dit que psql [option...] [dbname [username]] alors on pourrait penser psql dbname username travaillerait juste..

2 votes

Cela a également fonctionné pour moi. Je pense également que c'est une méthode bien plus préférable que de modifier les fichiers de configuration, surtout lorsque vous n'avez pas la moindre idée de ce que vous faites et que vous suivez simplement la réponse de SO pour résoudre votre problème.

230voto

flaviodesousa Points 599

Votre connexion a échoué car par défaut psql se connecte sur des sockets UNIX en utilisant peer l'authentification, qui exige que l'utilisateur UNIX actuel ait le même nom d'utilisateur que psql . Vous devrez donc créer l'utilisateur UNIX dev et ensuite se connecter en tant que dev ou utiliser sudo -u dev psql test_development pour accéder à la base de données (et psql devrait no demander un mot de passe).

Si vous ne pouvez pas ou ne voulez pas créer l'utilisateur UNIX, par exemple si vous voulez simplement vous connecter à votre base de données pour des raisons de sécurité, vous devez créer un utilisateur UNIX. ad hoc les requêtes, en forçant une connexion par socket en utilisant psql --host=localhost --dbname=test_development --username=dev (comme indiqué par la réponse de @meyerson) résoudra votre problème immédiat.

Mais si vous avez l'intention de forcer l'authentification par mot de passe via les sockets Unix au lieu de la méthode par les pairs, essayez de modifier les éléments suivants pg_hba.conf * ligne :

de

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

à

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peer signifie qu'il fera confiance à l'identité (authenticité) de l'utilisateur UNIX. Il ne demande donc pas de mot de passe.

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

Bien entendu, vous pouvez également créer des règles plus spécifiques pour une base de données ou un utilisateur particulier, certains utilisateurs disposant de peer et d'autres nécessitant des mots de passe.

Après avoir changé pg_hba.conf si PostgreSQL est en cours d'exécution, vous devrez lui faire relire la configuration en rechargeant ( pg_ctl reload ) ou le redémarrage ( sudo service postgresql restart ).

* Le fichier pg_hba.conf sera très probablement à /etc/postgresql/9.x/main/pg_hba.conf

Édité : Remarques de @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What incorporées dans la réponse.

5 votes

Comment permettez-vous peer ET md5 ? Lorsque je règle md5 alors je ne peux plus me connecter avec postgres utilisateur ! J'ai essayé d'ajouter plusieurs lignes, et de séparer la méthode par des virgules, mais ça n'a pas marché. Ok, j'ai trouvé mgoldwasser et cela a fonctionné. J'ai juste ajouté une autre ligne pour l'utilisateur postgres avec méthode peer !

3 votes

Ne vous inquiétez pas, vous pouvez définir l'authentification par les pairs pour des utilisateurs spécifiques (par exemple, votre nom d'utilisateur ou postgres). Il semble que les règles spécifiques prévalent sur les règles générales

1 votes

Sur certaines distributions, le fichier peut également se trouver ici : /var/lib/pgsql/9.4/data/pg_hba.conf

30voto

stefan.schwetschke Points 5143

L'authentification par les pairs signifie que postgres demande au système d'exploitation votre nom de connexion et l'utilise pour l'authentification. Pour vous connecter en tant qu'utilisateur "dev" en utilisant l'authentification par les pairs sur postgres, vous devez également être l'utilisateur "dev" sur le système d'exploitation.

Vous pouvez trouver des détails sur les méthodes d'authentification dans le manuel de l'utilisateur. Documentation Postgresql .

Un conseil : Si aucune méthode d'authentification ne fonctionne plus, déconnectez le serveur du réseau et utilisez la méthode "trust" pour "localhost" (et vérifiez à nouveau que votre serveur n'est pas joignable par le réseau lorsque la méthode "trust" est activée).

1 votes

Merci pour vos réponses, mais cela ne fonctionne toujours pas si je modifie l'adresse de l'ordinateur. dev à l'utilisateur du système XXX

2 votes

La réponse de stefan est correcte. Je viens d'ajouter un lien, qui sera visible lorsque mon édition sera revue, vers la documentation où chacune des méthodes d'authentification est expliquée.

25voto

tymik Points 426

Lorsque vous le spécifiez :

psql -U user

il se connecte via UNIX Socket, qui utilise par défaut peer l'authentification, sauf si cela est spécifié dans pg_hba.conf autrement.

Vous pouvez spécifier :

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

pour obtenir une connexion TCP/IP sur l'interface de bouclage (à la fois IPv4 et IPv6) pour l'adresse spécifiée. database y user .

Après les changements, vous devez redémarrer postgres ou recharger sa configuration. Le redémarrage devrait fonctionner dans les distros modernes basées sur RHEL/Debian :

service postgresql restart

Le rechargement devrait fonctionner de la manière suivante :

pg_ctl reload

mais la commande peut être différente selon la configuration du PATH - vous devrez peut-être spécifier le chemin absolu, qui peut être différent, selon la façon dont postgres a été installé.

Alors vous pouvez utiliser :

psql -h localhost -U user -d database

pour se connecter avec cette user à l'endroit indiqué database sur TCP/IP. md5 signifie mot de passe crypté, tandis que vous pouvez également spécifier password pour les mots de passe en texte clair lors de l'autorisation. Ces deux options ne devraient pas être d'une grande importance tant que le serveur de base de données n'est accessible que localement, sans accès au réseau.

Remarque importante : Définition de l'ordre dans pg_hba.conf questions - les règles sont lues de haut en bas, comme iptables, donc vous voulez probablement ajouter les règles proposées au-dessus de la règle :

host    all             all             127.0.0.1/32            ident

0 votes

Concernant la note importante : - l'ordre est important +1

24voto

mgoldwasser Points 377

La réponse de @flaviodesousa fonctionnerait, mais elle rend également obligatoire la saisie d'un mot de passe pour tous les utilisateurs (tous les autres).

Parfois, il est judicieux de conserver l'authentification par les pairs pour tout le monde, mais de faire une exception pour un utilisateur de service. Dans ce cas, il faut ajouter une ligne au fichier pg_hba.conf qui ressemble à ceci :

local   all             some_batch_user                         md5

Je vous recommande d'ajouter cette ligne juste en dessous de la ligne d'en-tête commentée :

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Vous devrez redémarrer PostgreSQL en utilisant

sudo service postgresql restart

Si vous utilisez la version 9.3, votre pg_hba.conf sera très probablement :

/etc/postgresql/9.3/main/pg_hba.conf

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