web-dev-qa-db-fra.com

psql: FATAL: L'authentification entre homologues a échoué pour l'utilisateur "dev"

quand 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’essaie de vous connecter psql -U dev -W test_development, mais j’obtiens l’erreur suivante:

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

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

180
hsming

Essayer:

psql user_name  -h 127.0.0.1 -d db_name

  • -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 auquel se connecter.

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

local   all             all                                     peer
285
meyerson

Votre connexion a échoué car psql se connecte par défaut aux sockets UNIX à l'aide de l'authentification peer, ce qui nécessite que l'utilisateur UNIX actuel porte le même nom d'utilisateur que psql. Vous devrez donc créer l'utilisateur UNIX dev, puis vous connecter en tant que dev ou utiliser Sudo -u dev psql test_development pour accéder à la base de données (et psql devrait pas demander un 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 , forçant une connexion socket. utiliser psql --Host=localhost --dbname=test_development --username=dev (comme indiqué par @Meerson réponse) 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 peer, essayez de modifier la ligne pg_hba.conf * suivante:

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. Donc, ne pas demander un mot de passe.

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

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

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

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

Edited: Remarques de @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_Quels commentaires ont été intégrés à la réponse.

208
flaviodesousa

L'authentification par les pairs signifie que postgres demande votre nom de connexion au système d'exploitation et l'utilise pour l'authentification. Pour vous connecter en tant qu'utilisateur "dev" à l'aide de l'authentification homologue 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 documentation Postgresql .

Allusion: 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 lorsque la méthode "trust" est activée).

29
stefan.schwetschke

Lorsque vous spécifiez:

psql -U user

il se connecte via le socket UNIX, qui utilise par défaut l'authentification peer, sauf indication contraire dans pg_hba.conf.

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 une interface de bouclage (IPv4 et IPv6) pour les paramètres spécifiés database et user.

Une fois les modifications apportées, 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, en fonction de la manière dont postgres a été installé.

Ensuite, vous pouvez utiliser:

psql -h localhost -U user -d database

pour vous connecter avec cette user à spécifié database sur TCP/IP. md5 signifie mot de passe crypté, mais vous pouvez également spécifier password pour les mots de passe en texte brut lors de l'autorisation. Ces 2 options ne devraient pas poser d’importants problèmes tant que le serveur de base de données n’est accessible que localement, sans accès réseau.

Remarque importante: L'ordre de définition dans pg_hba.conf est important - les règles sont lues de haut en bas, comme iptables. Vous souhaiterez donc probablement ajouter les règles proposées au-dessus de la règle:

Host    all             all             127.0.0.1/32            ident
23
tymik

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

Il est parfois judicieux de conserver l'authentification homologue pour tout le monde, mais de faire une exception pour un utilisateur de service. Dans ce cas, vous voudriez ajouter une ligne au fichier pg_hba.conf qui ressemble à ceci:

local   all             some_batch_user                         md5

Je vous recommanderais 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 fichier pg_hba.conf sera probablement:

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

22
mgoldwasser

Cela fonctionne pour moi quand je le rencontre:

Sudo -u username psql
12
alangrah

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;
8
Abel

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
2
Ikrom

Je devais simplement ajouter -h localhost

2
Rishinder

Pour les futurs utilisateurs, postgres est dans le /usr/lib/postgresql/10/bin de mon serveur Ubuntu.

Je l'ai ajouté à la variable PATH dans mon fichier .bashrc, puis 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 /wherever à partir de n'importe quel répertoire

1