psql: FATAL: l'authentification de l'homologue a échoué pour l'utilisateur «dev»

198

lorsque je crée un nouvel utilisateur, mais 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éez une base de données:

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

après cela, j'essaye de me psql -U dev -W test_developmentconnecter, mais j'obtiens l'erreur:

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

J'ai essayé de résoudre le problème mais j'ai échoué.

hsming
la source
2
échec de l'authentification
Daniel Vérité
maintenant, pour être invité à répondre aux questions ci-dessus, vous devez ajouter --interactiveà la commande:createuser --interactive joe
user3791372

Réponses:

310

Essayer:

psql -U user_name  -h 127.0.0.1 -d db_name

  • -U est le nom d'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

Ceci est ensuite évalué comme une connexion "réseau" par Postgresql plutôt qu'une connexion socket de domaine Unix, donc non évalué comme une connexion "locale" comme vous pouvez le voir dans pg_hba.conf:

local   all             all                                     peer
meyerson
la source
15
J'avais besoin (ver 9.4): psql -U nom-utilisateur -h 127.0.0.1 -d nom-db
Gregor
9
quel outil désagréable. le manuel dit psql [option...] [dbname [username]], donc vous penseriez que psql dbname usernamecela fonctionnerait ..
djeikyb
2
A également fonctionné pour moi. Je pense également que c'est un moyen beaucoup plus préférable que de changer les fichiers de configuration, surtout lorsque vous n'avez aucune idée de ce que vous faites et que vous suivez simplement la réponse SO pour résoudre votre problème.
borisano
1
cela a fonctionné pour moi, merci beaucoup, même si je fais une recherche pour savoir pourquoi c'était la bonne solution. néanmoins, dans une configuration sur une autre machine, je me connecterais en tant que base de données psql -U username -d. donc je suppose que la solution acceptée dépend du cas.
Lazarus Rising
2
Bonne réponse. J'obtenais de l'intérieur de la base de données après m'être connecté en tant que postgres \c glossary john FATAL: Peer authentication failed for user "john"puis avec \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".cela a fonctionné.
regardez
215

Votre connexion a échoué car, par défaut, se psqlconnecte sur des sockets UNIX à l'aide de l' peerauthentification, ce qui nécessite que l'utilisateur UNIX actuel ait le même nom d'utilisateur que psql. Vous devrez donc créer l'utilisateur UNIX devpuis vous connecter en tant que devou utiliser sudo -u dev psql test_developmentpour accéder à la base de données (et psqlne pas demander de mot de passe).

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

Mais si vous avez l'intention de forcer l'authentification par mot de passe sur les sockets Unix au lieu de la méthode homologue, essayez de modifier la pg_hba.confligne * suivante :

de

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

à

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

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

Bien sûr, vous pouvez également créer des règles plus spécifiques pour une base de données ou un utilisateur spécifique, certains utilisateurs ayant 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 en redémarrant (sudo service postgresql restart ).

* Le fichier pg_hba.confsera probablement à/etc/postgresql/9.x/main/pg_hba.conf

Modifié: Remarques de @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_What commentaires incorporés dans la réponse.

flaviodesousa
la source
5
Comment autorisez-vous peer AND md5 ? Lorsque je md5me connecte, je ne peux plus me connecter avec l' postgresutilisateur! J'ai essayé d'ajouter plusieurs lignes et de séparer la méthode par des virgules, mais cela n'a pas fonctionné. Ok j'ai trouvé mgoldwasserla réponse et ça a marché. Je viens d'ajouter une autre ligne pour l'utilisateur postgresavec la méthode peer!
Chloe
3
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 des règles spécifiques remplacent les règles générales
JavierIEH
1
Sur certaines distributions, le fichier peut également être trouvé ici:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher
2
ne pouvez-vous pas le faire sans redémarrer postgresql? ne pouvez-vous pas simplement spécifier la méthode d'authentification dans la table pg_user?
fccoelho
2
Vous pouvez recharger au lieu de redémarrer. Cela recharge la table pg_hba. A travaillé pour moi.
Joanis
29

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" à l'aide de 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 la documentation Postgresql .

Astuce: 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 que votre serveur n'est pas accessible via le réseau alors que la méthode "trust" est activée).

stefan.schwetschke
la source
1
merci pour vos réponses, mais cela ne fonctionne toujours pas si je change devd'utilisateur en systèmeXXX
hsming
2
La réponse de Stefan est correcte. Je viens d'ajouter un lien, qui sera visible lorsque ma modification sera examinée, vers la documentation où chacune des méthodes d'authentification est expliquée.
dsh
25

Lorsque vous spécifiez:

psql -U user

il se connecte via UNIX Socket, qui utilise par défaut l' peerauthentification, sauf pg_hba.confindication contraire.

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 (IPv4 et IPv6) pour spécifié databaseet user.

Après les modifications, vous devez redémarrer postgres ou recharger sa configuration. Redémarrez qui devrait fonctionner dans les distributions 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 différer en fonction de la configuration de PATH - vous devrez peut-être spécifier un chemin absolu, qui peut être différent, selon la façon dont le postgres a été installé.

Ensuite, vous pouvez utiliser:

psql -h localhost -U user -d database

pour vous connecter avec celui userspécifié databasesur TCP / IP. md5signifie mot de passe crypté, tandis que vous pouvez également spécifier passworddes mots de passe en texte brut lors de l'autorisation. Ces 2 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: ordre de définition en la pg_hba.confmatière - les règles sont lues de haut en bas, comme iptables, donc vous voudrez probablement ajouter des règles proposées au-dessus de la règle:

host    all             all             127.0.0.1/32            ident
tymik
la source
re la note importante: - l'ordre est important +1
hawkeye
23

Bien que la réponse de @ flaviodesousa fonctionne, elle oblige également tous les utilisateurs (tous les autres) à entrer un mot de passe.

Parfois, il est logique de conserver l'authentification par les pairs pour tout le monde, mais faites une exception pour un utilisateur de service. Dans ce cas, vous voudriez ajouter une ligne au pg_hba.conf qui ressemble à:

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 9.3, votre pg_hba.conf serait très probablement:

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

mgoldwasser
la source
12

Cela fonctionne pour moi quand je le rencontre:

sudo -u username psql
alangrah
la source
ne fonctionne que si vous créez un nouvel utilisateur tout sur le système et dans Postgres - hsming veut juste se connecter à postgres avec l'utilisateur postgres nouvellement créé, dev.
Kenneth
8

La solution la plus simple:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;
Abel
la source
6

Je devais simplement ajouter -h localhost

VPaul
la source
Mon problème était d'utiliser des postgres sur une framboise. ^^^ a fonctionné pour moi !! Je vous remercie!
tidydee
2

Dans mon cas, j'utilisais un port différent. La valeur par défaut est 5432. J'utilisais 5433. Cela a fonctionné pour moi:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
Ikrom
la source
Cela peut se produire automatiquement lorsque vous avez plusieurs installations de postgres.
Galigator
1

Pour les personnes à l'avenir voyant cela, postgresest dans le/usr/lib/postgresql/10/bin sur mon serveur Ubuntu.

Je l'ai ajouté au PATH dans mon fichier .bashrc, et j'ai ajouté cette ligne à la fin

PATH=$PATH:/usr/lib/postgresql/10/bin

puis sur la ligne de commande

$> source ./.bashrc

J'ai rafraîchi mon environnement bash. Maintenant, je peux utiliser à postgres -D /whereverpartir de n'importe quel répertoire

Tyler Curtis Jowers
la source
1

pg_dump -h localhost -U postgres -F c -b -v -f mydb.backup mydb

Dmitry Shilin
la source
À quelle question cette réponse répond-elle? Pourquoi pourrait -U postgresêtre pivot? Quelles sont toutes ces lettres de tiret , de toute façon?
greybeard
0

Essayer:

psql -U nom_rôle -d base de données -h nomhôte..com -W

Srinu Mareti
la source
Veuillez ajouter un peu plus de contexte à votre réponse.
Death Waltz