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é.
Essayer:
psql user_name -h 127.0.0.1 -d db_name
où
-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
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.
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).
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
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
Cela fonctionne pour moi quand je le rencontre:
Sudo -u username psql
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;
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
Je devais simplement ajouter -h localhost
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