Rails: FATAL - Autenticazione peer non riuscita per l'utente (PG :: Errore)


143

Sto eseguendo il mio sviluppo su Ubuntu 11.10 e RubyMine

Ecco le mie impostazioni di sviluppo per database.yml: che RubyMine ha creato per me

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

quando provo a eseguire l'app, visualizzo questo errore di seguito, sembra che non abbia ancora creato un utente 'progetto', ma come posso creare un utente e garantirgli un database in Postgres? se questo è il problema, qual è lo strumento consigliato da utilizzare in Ubuntu per questa attività? se questo non è il problema, si prega di avvisare.

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

Risposte:


315

Se hai installato postresql sul tuo server, allora solo host: localhost in database.yml, di solito lo butto in giro dove dice pool: 5. Altrimenti se non è localhost sicuramente dire a quell'app dove trovare il suo database.

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

Assicurati che le credenziali dell'utente siano impostate correttamente creando un database e assegnando la proprietà all'utente della tua app per stabilire la connessione. Per creare un nuovo utente nell'esecuzione di postgresql 9:

sudo -u postgres psql

imposta la password utente postgresql se non l'hai, è solo una barra rovesciata.

postgres=# \password

Creare un nuovo utente e password e il nuovo database dell'utente:

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

Ora aggiorna il tuo file database.yml dopo aver confermato la creazione del database, dell'utente, della password e impostato questi privilegi. Non dimenticare host: localhost.


2
se hai ancora problemi ad accedere e completare la connessione su localhost, poi torna in postgresql tramite il terminale e applica alcune di queste convenzioni 8.2 per stabilire i privilegi dell'utente in connessione, la sintassi è GRANT ALL ON DATABASE [dbname] su [nomeutente]. Questa sintassi funziona allo stesso modo su psql 9+, ma probabilmente puoi solo abilitare / disabilitare le autorizzazioni sui database di proprietà dell'utente prima che concederà TUTTO: postgresql.org/docs/8.2/static/sql-grant.html
Bent Cardan,

38
host: localhoste pool: 5mancava nella mia configurazione. Dopo averli aggiunti, l'errore è scomparso.
Amit Patel,

21
Per me host: localhostmancava. dopo averlo aggiunto, tutto ha funzionato. Questo è in Ubuntu 13.04
Jesse il

7
Anche importante sottolineare: NON DIMENTICARE I SEMICOLONI .
Maarten,

Personalmente penso che sia importante essere in grado di eseguire il setup con rake db: setup. In caso contrario, si verificheranno problemi nella generazione di un nuovo ambiente di distribuzione, ma questa descrizione funziona per un ambiente di sviluppo.
Ashley Raiteri,

54

Questo è il modo più sicuro per far funzionare la tua app Rails con Postgres nell'ambiente di sviluppo di Ubuntu 13.10.

1) Crea l'app Rails con YAML postgres e la gemma "pg" nel Gemfile:

$ rails new my_application -d postgresql

2) Dagli alcune funzionalità CRUD. Se stai vedendo se Postgres funziona, crea uno scaffold:

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

3) A partire dal rails 4.0.1l' -d postgresqlopzione genera un YAML che non include un parametro host. Ho scoperto che avevo bisogno di questo. Modifica la sezione di sviluppo e crea i seguenti parametri:

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

Si noti che il databaseparametro è per un database che non esce ancora e usernameche passwordsono le credenziali per un ruolo che non esiste. Li creeremo più avanti!

Ecco come config/database.ymldovrebbe apparire (nessuna vergogna nel copypasting: 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) Avvia la shell postgres con questo comando:

$ psql

4a) È possibile che venga visualizzato questo errore se l'utente corrente (come nell'utente del computer) non ha un ruolo postgres di amministrazione corrispondente.

psql: FATAL:  role "your_username" does not exist

Ora ho installato Postgres solo una volta, quindi potrei sbagliarmi qui, ma penso che Postgres crei automaticamente un ruolo amministrativo con le stesse credenziali dell'utente come Postgres.

4b) Quindi questo significa che devi cambiare l'utente che ha installato Postgres per usare il comando psql e avviare la shell:

$ sudo su postgres

E poi corri

$ psql

5) Saprai di essere nella shell Postgres perché il tuo terminale sarà simile a questo:

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

postgres=# 

6) Utilizzando la sintassi PostgreSQL, creiamo l'utente abbiamo specificato in config/database.yml's sviluppo sezione:

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

Ora, ci sono alcune sottigliezze qui, quindi esaminiamole.

  • Il nome utente del ruolo, thisismynewusername , non contiene citazioni di alcun tipo
  • Specificare la parola chiave LOGIN dopo il WITH . In caso contrario, il ruolo verrà comunque creato, ma non sarà in grado di accedere al database!
  • La password del ruolo, thisismynewpassword , deve essere racchiusa tra virgolette singole. Non doppie virgolette .
  • Aggiungi un punto e virgola all'estremità;)

Dovresti vedere questo nel tuo terminale:

postgres=#
CREATE ROLE
postgres=#

Ciò significa "ROLE CREATED", ma gli allarmi di postgres sembrano adottare le stesse convenzioni imperative di git hub.

7) Ora, sempre nella shell postgres, dobbiamo creare il database con il nome che abbiamo impostato in YAML. Rendi l'utente che abbiamo creato nel passaggio 6 il suo proprietario:

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

Saprai se hai avuto successo perché otterrai l'output:

CREATE DATABASE

8) Esci dalla shell postgres:

\q

9) Ora il momento della verità:

$ RAILS_ENV=development rake db:migrate

Se ottieni questo:

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

Congratulazioni, Postgres funziona perfettamente con la tua app.

9a) Sul mio computer locale, ho continuato a ricevere un errore di autorizzazione. Non riesco a ricordarmelo esattamente, ma è stato un errore del genere

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

Anche se consiglierei di pensare molto attentamente all'impostazione ricorsiva dei privilegi di scrittura su una macchina di produzione, a livello locale, ho dato a tutta la mia app i privilegi di scrittura come questo:

9b) Salire di un livello di directory:

$ cd ..

9c) Impostare le autorizzazioni della directory my_application e tutto il suo contenuto su 666:

$ chmod -R 0666 my_application

9d) Ed eseguire nuovamente la migrazione:

$ RAILS_ENV=development rake db:migrate

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

Alcuni consigli e suggerimenti se ti sporchi

Prova questi prima di riavviare tutti questi passaggi:

L'utente mynewusername non ha i privilegi di CRUD per il my_app_developmentdatabase? Rilascia il database e crealo di nuovo con mynewusername come proprietario:

1) Avvia la shell postgres:

$ psql

2) Rilasciare il my_app_developmentdatabase. Stai attento! Rilascia significa eliminare completamente!

postgres=# DROP DATABASE my_app_development;

3) Ricreare un altro my_app_developmente rendere mynewusername il proprietario:

postgres=# CREATE DATABASE my_application_development OWNER mynewusername;

4) Esci dalla shell:

postgres=# \q

L' mynewusernameutente non può accedere al database? Pensi di aver scritto la password sbagliata in YAML e non ricordi bene la password che hai inserito usando la shell postgres? Basta modificare il ruolo con la password YAML:

1) Apri il tuo YAML e copia la password negli appunti:

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

2) Avvia la shell postgres:

$ psql    

3) Aggiorna mynewusernamela password. Incolla la password e ricorda di racchiuderla tra virgolette singole:

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;

4) Esci dalla shell:

postgres=# \q

Stai provando a connetterti a localhost tramite un visualizzatore di database come Dbeaver e non sai qual è la password del tuo utente postgres? Modificalo in questo modo:

1) Esegui passwdcome superutente:

$ sudo passwd postgres

2) Inserisci la password del tuo account per sudo(niente a che fare con Postgres):

[sudo] password for starkers: myaccountpassword

3) Creare il nuovo passwod dell'account Postgres:

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

Ricevi questo messaggio di errore ?:

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) Devi dare al tuo utente la possibilità di creare database. Dalla shell psql:

ALTER ROLE thisismynewusername WITH CREATEDB

1
Vorrei poterti dare più +1 s per questa brillante soluzione, sarei ancora più felice se funzionasse per me. risposta ancora brillante. domanda veloce, quei backtick attorno alla password hanno un ruolo alternativo? inoltre, non è necessario utilizzare i backtick prima di te?
Mike HR,

@ MikeH-R Grazie, peccato che non funzioni per te! Sei sicuro del tuo YAML rilevante host: localhost? Questo è stato il vero gotcha per me. Intorno alla password hai bisogno di virgolette singole. Sulla mia tastiera c'è shift+ @. Con la shell psql sono necessari solo virgolette singole attorno ad alcuni parametri. Ne hai bisogno in base alla password e non al nome del ruolo, ad esempio. È molto complicato essere sincero, ma va bene una volta che sai che sono sfumature :)
Starkers,

@ MikeH-R Ho modificato la mia risposta per rendere le cose più chiare. Considera di avere un'altra crepa!
Starkers,

risolto il problema ora, grazie ancora per una risposta brillante, la maggior parte delle altre risposte che ho incontrato riguardavano l'allentamento della sicurezza che ovviamente non va bene nella produzione.
Mike HR,

29

Per soluzione permanente:

Il problema è con il tuo pg_hba. Questa linea:

local   all             postgres                                peer

Dovrebbe essere

local   all             postgres                                md5

Quindi riavviare il server postgresql dopo aver modificato questo file.

Se sei su Linux, il comando sarebbe

sudo service postgresql restart

1
Grazie! Questa è la vera risposta
skplunkerin,

9

Stavo affrontando lo stesso problema sulla macchina Ubuntu, quindi ho rimosso questo errore seguendo alcuni passaggi. Passa all'utente postgres

$ sudo su - postgres

chiederà la password e per impostazione predefinita la password è postgres

Dopo aver impostato l'utente su Postgres, aprire la console psql

$ psql

quindi controlla la versione di Postgres se sono disponibili più versioni

psql=# select VERSION();

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

Ora aperto postgres user

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

9.1 è la versione restituita dal comando superiore

e sostituisci

local   all             postgres                                peer

per

local   all             postgres                                md5

Riavvia il servizio

sudo service postgresql restart

Scrivo anche passaggi sul mio blog

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


Hai dato la risposta giusta, hai perso solo una cosa che non è necessario controllare la versione. È possibile modificare la password eseguendo questo comando dopo psql Modifica l'utente "nome utente" imposta la password 'xyz';
vishu,

Ricorda che l' md5autenticazione richiede una password non nulla per l'utente del tuo database (oggi ne ho appena sentito un po 'mentre cercavo di massimizzare la pigrizia durante la creazione di un'applicazione Rails).
Mark Leighton Fisher,

5

Puoi andare al tuo file /var/lib/pgsql/data/pg_hba.conf e aggiungere fiducia al posto di Ident It ha funzionato per me.

local   all all trust
host    all 127.0.0.1/32    trust

Per ulteriori dettagli fare riferimento a questo problema L' autenticazione Ident non è riuscita per l'utente


Centos 6.6, prova:/var/lib/pgsql/9.2/data/pg_hba.conf
Patrick,

4

L'aggiunta è host: localhoststata la magia per me

development:
  adapter: postgresql
  database: database_name_here
  host: localhost
  username: user_name_here

0

Se viene visualizzato quel messaggio di errore ( Peer authentication failed for user (PG::Error)) durante l'esecuzione di unit test, assicurarsi che il database di test esista.


0

Ho anche riscontrato questo stesso problema mentre lavoravo nel mio ambiente di sviluppo, il problema era che ho lasciato host: localhostcommentato nel config/database.ymlfile.

Quindi la mia applicazione non è riuscita a connettersi al database PostgreSQL, semplicemente decommentando ha risolto il problema.

development:
  <<: *default
  database: database_name

  username: database_username 

  password: database_password

  host: localhost

È tutto.

Spero che aiuti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.