Rails: FATAL - L'authentification homologue a échoué pour l'utilisateur (PG :: Error)

143

J'exécute mon développement sur Ubuntu 11.10 et RubyMine

Voici mes paramètres de développement pour le database.yml: que RubyMine a créé pour moi

development:
  adapter: postgresql
  encoding: unicode
  database: mydb_development
  pool: 5
  username: myuser
  password:

lorsque j'essaie d'exécuter l'application, j'obtiens cette erreur ci-dessous, il semble que je n'ai pas encore créé d'utilisateur `` projet '', mais comment puis-je créer un utilisateur et lui accorder une base de données dans postgres? si tel est le problème, quel est l'outil recommandé à utiliser dans Ubuntu pour cette tâche? si ce n'est pas le problème, merci de nous conseiller.

Exiting
/home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1194:in `initialize': FATAL:  Peer authentication failed for user "project" (PG::Error)
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1194:in `new'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:1194:in `connect'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:329:in `initialize'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `new'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:28:in `postgresql_connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:303:in `new_connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:313:in `checkout_new_connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:237:in `block (2 levels) in checkout'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:232:in `loop'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:232:in `block in checkout'
    from /home/sam/.rvm/rubies/ruby-1.9.3-p0/lib/ruby/1.9.1/monitor.rb:211:in `mon_synchronize'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:229:in `checkout'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:95:in `connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_pool.rb:398:in `retrieve_connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:168:in `retrieve_connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/connection_adapters/abstract/connection_specification.rb:142:in `connection'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/model_schema.rb:308:in `clear_cache!'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activerecord-3.2.3/lib/active_record/railtie.rb:91:in `block (2 levels) in <class:Railtie>'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:418:in `_run__757346023__prepare__404863399__callbacks'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:405:in `__run_callback'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:385:in `_run_prepare_callbacks'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/callbacks.rb:81:in `run_callbacks'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/actionpack-3.2.3/lib/action_dispatch/middleware/reloader.rb:74:in `prepare!'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/actionpack-3.2.3/lib/action_dispatch/middleware/reloader.rb:48:in `prepare!'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/application/finisher.rb:47:in `block in <module:Finisher>'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:30:in `instance_exec'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:30:in `run'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:54:in `each'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/initializable.rb:54:in `run_initializers'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/application.rb:136:in `initialize!'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/railtie/configurable.rb:30:in `method_missing'
    from /home/sam/RubymineProjects/project/config/environment.rb:5:in `<top (required)>'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `block in require'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:236:in `load_dependency'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/activesupport-3.2.3/lib/active_support/dependencies.rb:251:in `require'
    from /home/sam/RubymineProjects/project/config.ru:4:in `block in <main>'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:51:in `instance_eval'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:51:in `initialize'
    from /home/sam/RubymineProjects/project/config.ru:1:in `new'
    from /home/sam/RubymineProjects/project/config.ru:1:in `<main>'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:40:in `eval'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/builder.rb:40:in `parse_file'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/server.rb:200:in `app'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands/server.rb:46:in `app'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/server.rb:301:in `wrapped_app'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/rack-1.4.1/lib/rack/server.rb:252:in `start'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands/server.rb:70:in `start'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands.rb:55:in `block in <top (required)>'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands.rb:50:in `tap'
    from /home/sam/.rvm/gems/ruby-1.9.3-p0@project/gems/railties-3.2.3/lib/rails/commands.rb:50:in `<top (required)>'
    from /home/sam/RubymineProjects/project/script/rails:6:in `require'
    from /home/sam/RubymineProjects/project/script/rails:6:in `<top (required)>'
    from -e:1:in `load'
    from -e:1:in `<main>'

Process finished with exit code 1
simo
la source

Réponses:

315

Si vous avez installé postresql sur votre serveur, alors host: localhost à database.yml, je le jette généralement là où il est dit pool: 5. Sinon, si ce n'est pas localhost, indiquez définitivement à cette application où trouver sa base de données.

development:
  adapter: postgresql
  encoding: unicode
  database: kickrstack_development
  host: localhost
  pool: 5
  username: kickrstack
  password: secret

Assurez-vous que vos informations d'identification utilisateur sont correctement définies en créant une base de données et en attribuant la propriété à l'utilisateur de votre application pour établir la connexion. Pour créer un nouvel utilisateur dans postgresql 9, exécutez:

sudo -u postgres psql

définissez le mot de passe de l'utilisateur postgresql si vous ne l'avez pas fait, il s'agit simplement d'un mot de passe de barre oblique inverse.

postgres=# \password

Créez un nouvel utilisateur et un nouveau mot de passe et la nouvelle base de données de l'utilisateur:

postgres=# create user "guy_on_stackoverflow" with password 'keepitonthedl';
postgres=# create database "dcaclab_development" owner "guy_on_stackoverflow"; 

Mettez maintenant à jour votre fichier database.yml après avoir confirmé la création de la base de données, de l'utilisateur, du mot de passe et défini ces privilèges. N'oubliez pas l'hôte: localhost.

Cardan courbé
la source
2
si vous rencontrez toujours des difficultés pour vous connecter et terminer la connexion sur localhost, revenez dans postgresql via le terminal et appliquez certaines de ces conventions 8.2 pour établir les privilèges de votre utilisateur qui se connecte, la syntaxe est GRANT ALL ON DATABASE [dbname] à [usrname]. Cette syntaxe fonctionne de la même manière sur psql 9+, mais vous ne pouvez probablement basculer que les autorisations sur les bases de données appartenant à l'utilisateur avant qu'il ne GRANT ALL: postgresql.org/docs/8.2/static/sql-grant.html
Bent Cardan
38
host: localhostet pool: 5manquait dans ma config. Après les avoir ajoutés, l'erreur a disparu.
Amit Patel
21
Pour moi, host: localhostil manquait. après avoir ajouté cela, tout a fonctionné. C'est dans Ubuntu 13.04
Jesse
7
Il est également important de souligner: N'OUBLIEZ PAS LES SEMICOLONS .
Maarten
Personnellement, je pense qu'il est important de pouvoir exécuter l'installation avec rake db: setup. Sinon, vous allez avoir des problèmes pour générer un nouvel environnement de déploiement, mais cette description fonctionne pour un environnement de développement.
Ashley Raiteri
54

C'est le moyen le plus infaillible de faire fonctionner votre application rails avec postgres dans l' environnement de développement d'Ubuntu 13.10.

1) Créez une application de rails avec postgres YAML et gemme 'pg' dans le Gemfile:

$ rails new my_application -d postgresql

2) Donnez-lui une fonctionnalité CRUD. Si vous voyez simplement si postgres fonctionne, créez un échafaudage:

$ rails g scaffold cats name:string age:integer colour:string

3) À partir de rails 4.0.1l' -d postgresqloption, génère un YAML qui n'inclut pas de paramètre d'hôte. J'ai trouvé que j'avais besoin de ça. Modifiez la section de développement et créez les paramètres suivants:

encoding: UTF-8
host: localhost
database: my_application_development
username: thisismynewusername
password: thisismynewpassword 

Notez que le databaseparamètre est pour une base de données qui ne se ferme pas encore, et les usernameet passwordsont les informations d'identification d'un rôle qui n'existe pas non plus. Nous les créerons plus tard!

Voici à quoi config/database.ymldevrait ressembler (pas de honte en copypast: D):

development:
  adapter: postgresql
  pool: 5
  # these are our new parameters
  encoding: UTF-8
  database: my_application_development
  host: localhost
  username: thisismynewusername
  password: thisismynewpassword

test:
  # this won't work 
  adapter: postgresql
  encoding: unicode
  database: my_application_test
  pool: 5
  username: my_application
  password:

production:
  # this won't work 
  adapter: postgresql
  encoding: unicode
  database: my_application_production
  pool: 5
  username: my_application
  password:

4) Démarrez le shell postgres avec cette commande:

$ psql

4a) Vous pouvez obtenir cette erreur si votre utilisateur actuel (comme dans votre ordinateur) n'a pas de rôle d'administration postgres correspondant.

psql: FATAL:  role "your_username" does not exist

Maintenant, je n'ai installé postgres qu'une seule fois, donc je me trompe peut-être ici, mais je pense que postgres crée automatiquement un rôle d'administration avec les mêmes informations d'identification que l'utilisateur que vous avez installé postgres.

4b) Cela signifie donc que vous devez passer à l'utilisateur qui a installé postgres pour utiliser la commande psql et démarrer le shell:

$ sudo su postgres

Et puis courir

$ psql

5) Vous saurez que vous êtes dans le shell postgres car votre terminal ressemblera à ceci:

$ psql
psql (9.1.10)
Type "help" for help.

postgres=# 

6) En utilisant la syntaxe postgresql, créons l'utilisateur que nous avons spécifié dans config/database.ymlla section développement de :

postgres=# CREATE ROLE thisismynewusername WITH LOGIN PASSWORD 'thisismynewpassword';

Maintenant, il y a quelques subtilités ici, alors passons en revue.

  • Le nom d'utilisateur du rôle, thisismynewusername , ne citation de quelque nature que ce soit
  • Spécifiez le mot-clé LOGIN après le WITH . Sinon, le rôle sera toujours créé, mais il ne pourra pas se connecter à la base de données!
  • Le mot de passe du rôle, thisismynewpassword , doit être entre guillemets simples. Pas de guillemets doubles .
  • Ajoutez un point-virgule à la fin;)

Vous devriez voir ceci dans votre terminal:

postgres=#
CREATE ROLE
postgres=#

Cela signifie «ROLE CREATED», mais les alertes de postgres semblent adopter les mêmes conventions impératives que git hub.

7) Maintenant, toujours dans le shell postgres, nous devons créer la base de données avec le nom que nous avons défini dans le YAML. Faites de l'utilisateur que nous avons créé à l'étape 6 son propriétaire:

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

Vous saurez si vous avez réussi car vous obtiendrez le résultat:

CREATE DATABASE

8) Quittez le shell postgres:

\q

9) Maintenant le moment de vérité:

$ RAILS_ENV=development rake db:migrate

Si vous obtenez ceci:

==  CreateCats: migrating =================================================
-- create_table(:cats)
   -> 0.0028s
==  CreateCats: migrated (0.0028s) ========================================

Félicitations, postgres fonctionne parfaitement avec votre application.

9a) Sur ma machine locale, j'ai continué à recevoir une erreur d'autorisation. Je ne m'en souviens pas exactement, mais c'était une erreur du genre

Can't access the files. Change permissions to 666.

Bien que je vous conseille de réfléchir très attentivement à la définition récursive de privilèges d'écriture sur une machine de production, localement, j'ai donné à l'ensemble de mon application des privilèges de lecture en écriture comme ceci:

9b) Montez d'un niveau de répertoire:

$ cd ..

9c) Définissez les autorisations du répertoire my_application et de tout son contenu sur 666:

$ chmod -R 0666 my_application

9d) Et relancez la migration:

$ RAILS_ENV=development rake db:migrate

==  CreateCats: migrating =================================================
-- create_table(:cats)
   -> 0.0028s
==  CreateCats: migrated (0.0028s) ========================================

Quelques trucs et astuces si vous vous moquez

Essayez-les avant de redémarrer toutes ces étapes:

L'utilisateur mynewusername n'a pas les privilèges CRUD sur le my_app_development base de données? Supprimez la base de données et créez-la à nouveau avec mynewusername en tant que propriétaire:

1) Démarrez le shell postgres:

$ psql

2) Supprimez la my_app_developmentbase de données. Faites attention! Drop signifie supprimer complètement!

postgres=# DROP DATABASE my_app_development;

3) my_app_developmentRecréez-en un autre et faites de mon nouveau nom d'utilisateur le propriétaire:

postgres=# CREATE DATABASE my_application_development OWNER mynewusername;

4) Quittez le shell:

postgres=# \q

L' mynewusernameutilisateur ne peut pas se connecter à la base de données? Vous pensez avoir écrit le mauvais mot de passe dans le YAML et que vous ne vous souvenez plus du mot de passe que vous avez entré à l'aide du shell postgres? Modifiez simplement le rôle avec le mot de passe YAML:

1) Ouvrez votre YAML et copiez le mot de passe dans votre presse-papiers:

 development:
      adapter: postgresql
      pool: 5
      # these are our new parameters
      encoding: UTF-8
      database: my_application_development
      host: localhost
      username: thisismynewusername
      password: musthavebeenverydrunkwheniwrotethis

2) Démarrez le shell postgres:

$ psql    

3) Mettre à jour mynewusernamele mot de passe de. Collez le mot de passe et n'oubliez pas de mettre des guillemets simples autour de celui-ci:

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;

4) Quittez le shell:

postgres=# \q

Vous essayez de vous connecter à localhost via un visualiseur de base de données tel que Dbeaver, et vous ne savez pas quel est le mot de passe de votre utilisateur postgres? Changez-le comme ceci:

1) Exécutez en passwdtant que superutilisateur:

$ sudo passwd postgres

2) Entrez le mot de passe de votre compte pour sudo(rien à voir avec postgres):

[sudo] password for starkers: myaccountpassword

3) Créez le nouveau mot de passe du compte postgres:

Enter new UNIX password: databasesarefun
Retype new UNIX password: databasesarefun
passwd: password updated successfully

Vous recevez ce message d'erreur?:

Run `$ bin/rake db:create db:migrate` to create your database
$ rake db:create db:migrate
PG::InsufficientPrivilege: ERROR:  permission denied to create database

4) Vous devez donner à votre utilisateur la possibilité de créer des bases de données. Depuis le shell psql:

ALTER ROLE thisismynewusername WITH CREATEDB
Starkers
la source
1
J'aimerais pouvoir vous donner plus de +1 s pour cette solution brillante, je serais encore plus heureux si cela fonctionnait pour moi. réponse encore brillante. question rapide, est-ce que ces backticks autour du mot de passe ont un autre rôle? aussi, vous n'avez pas besoin d'utiliser des backticks plus tôt n'est-ce pas?
Mike HR
@ MikeH-R Merci, dommage que cela ne fonctionne pas pour vous! Êtes-vous sûr que votre YAML pertinent a host: localhost? C'était le vrai problème pour moi. Autour du mot de passe, vous avez besoin de guillemets simples. Sur mon clavier c'est shift+ @. Avec le shell psql, vous n'avez besoin que de guillemets simples autour de certains paramètres. Vous en avez besoin autour du mot de passe, et non autour du nom du rôle, par exemple. C'est très délicat pour être honnête, mais d'accord une fois que vous savez que ce sont les nuances :)
Starkers
@ MikeH-R J'ai peaufiné ma réponse pour clarifier les choses. Pensez à avoir une autre fissure!
Starkers le
trié maintenant, merci encore pour une réponse brillante, la plupart des autres réponses que j'ai rencontrées concernaient le relâchement de la sécurité, ce qui n'est évidemment pas bon en production.
Mike HR
29

Pour une solution permanente:

Le problème vient de votre pg_hba. Cette ligne:

local   all             postgres                                peer

Devrait être

local   all             postgres                                md5

Redémarrez ensuite votre serveur postgresql après avoir modifié ce fichier.

Si vous êtes sous Linux, la commande serait

sudo service postgresql restart
Sumit Munot
la source
1
Je vous remercie! C'est la vraie réponse.
skplunkerin le
9

J'étais confronté au même problème sur la machine Ubuntu, j'ai donc supprimé cette erreur en suivant quelques étapes. Passer à l'utilisateur postgres

$ sudo su - postgres

il demandera le mot de passe et par défaut le mot de passe est postgres

Après avoir basculé l'utilisateur sur postgres, ouvrez la console psql

$ psql

alors vérifiez la version de postgres si plusieurs versions sont disponibles

psql=# select VERSION();

PostgreSQL 9.1.13 on x86_64-unk....         # so version is 9.1

Ouvert postgres user

vim /etc/postgresql/9.1/main/pg_hba.conf

9.1 est la commande supérieure du formulaire de retour de version

et remplacer

local   all             postgres                                peer

à

local   all             postgres                                md5

Redémarrez le service

sudo service postgresql restart

J'écris aussi des étapes sur mon blog

http://tarungarg402.blogspot.in/2014/10/set-up-postgresql-on-ubuntu.html

Tarun Garg
la source
Vous avez donné la bonne réponse, vous n'avez manqué qu'une chose dont vous n'avez pas besoin de vérifier la version. Vous pouvez changer le mot de passe en exécutant cette commande après psql Alter user "username" set password 'xyz';
vishu
Rappelez-vous que l' md5authentification nécessite un mot de passe non nul pour l'utilisateur de votre base de données (je viens de le perdre aujourd'hui en essayant de maximiser la paresse lors de la création d'une application Rails).
Mark Leighton Fisher
5

Vous pouvez aller dans votre fichier /var/lib/pgsql/data/pg_hba.conf et ajouter la confiance à la place de Ident. Cela a fonctionné pour moi.

local   all all trust
host    all 127.0.0.1/32    trust

Pour plus de détails, reportez-vous à ce problème L' authentification d'identité a échoué pour l'utilisateur

Rastee
la source
Centos 6.6, essayez:/var/lib/pgsql/9.2/data/pg_hba.conf
Patrick
4

L'ajout host: localhostétait la magie pour moi

development:
  adapter: postgresql
  database: database_name_here
  host: localhost
  username: user_name_here
Ispirett
la source
0

Si vous obtenez ce message d'erreur ( Peer authentication failed for user (PG::Error)) lors de l'exécution de tests unitaires, assurez-vous que la base de données de test existe.

David Winiecki
la source
0

J'ai également rencontré ce même problème en travaillant dans mon environnement de développement, le problème était que j'avais laissé des host: localhostcommentaires dans leconfig/database.yml fichier.

Donc, mon application n'a pas pu se connecter à la base de données PostgreSQL, il suffit de la décommenter pour résoudre le problème.

development:
  <<: *default
  database: database_name

  username: database_username 

  password: database_password

  host: localhost

C'est tout.

J'espère que ça aide

Promesse Preston
la source