Rails: FATAL - Falha na autenticação de pares para o usuário (PG :: Error)

143

Estou executando meu desenvolvimento no Ubuntu 11.10 e RubyMine

Aqui estão minhas configurações de desenvolvimento para o database.yml: que o RubyMine criou para mim

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

quando tento executar o aplicativo, recebo este erro abaixo, parece que ainda não criei um usuário de 'projeto', mas como posso criar um usuário e conceder a ele um banco de dados no postgres? se esse for o problema, qual é a ferramenta recomendada para usar no Ubuntu para esta tarefa? Se este não for o problema, aconselhe-o.

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
fonte

Respostas:

315

Se você instalou o postresql em seu servidor, basta hospedar: localhost para database.yml, geralmente o coloco em torno de onde diz pool: 5. Caso contrário, se não for o localhost, diga ao aplicativo onde encontrar seu banco de dados.

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

Verifique se as credenciais do usuário estão definidas corretamente, criando um banco de dados e atribuindo propriedade ao usuário do aplicativo para estabelecer a conexão. Para criar um novo usuário no postgresql 9, execute:

sudo -u postgres psql

defina a senha de usuário do postgresql, se você não tiver, é apenas uma senha de barra invertida.

postgres=# \password

Crie um novo usuário e senha e o novo banco de dados do usuário:

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

Agora atualize seu arquivo database.yml após confirmar a criação do banco de dados, usuário, senha e defina esses privilégios. Não se esqueça de host: localhost.

Bent Cardan
fonte
2
se você ainda estiver com problemas para efetuar login e concluir a conexão pelo host local, volte ao postgresql através do terminal e aplique algumas destas convenções 8.2 para estabelecer os privilégios do usuário que está conectando, a sintaxe é GRANT ALL ON DATABASE [dbname] para [usrname]. Essa sintaxe funciona no psql 9+ da mesma forma, mas você provavelmente só pode alternar permissões nos bancos de dados de propriedade do usuário antes de conceder TODOS: postgresql.org/docs/8.2/static/sql-grant.html
Bent Cardan
38
host: localhoste pool: 5estava faltando na minha configuração. Depois de adicioná-los, o erro desapareceu.
Amit Patel
21
Para mim host: localhostestava faltando. depois que adicionei, tudo funcionou. Isso está no Ubuntu 13.04
Jesse
7
Também é importante ressaltar: NÃO ESQUEÇA OS SEMICOLONS .
Maarten
Pessoalmente, acho importante poder executar a instalação com o rake db: setup. Caso contrário, você terá problemas ao gerar um ambiente de implementação novo, mas essa descrição funciona para um ambiente de desenvolvimento.
21414 Ashley Ingreis #
54

Esta é a maneira mais infalível de fazer com que seu aplicativo Rails funcione com o postgres no ambiente de desenvolvimento no Ubuntu 13.10.

1) Crie um aplicativo rails com o postgres YAML e a gem 'pg' no Gemfile:

$ rails new my_application -d postgresql

2) Dê a ele alguma funcionalidade CRUD. Se você está apenas vendo se o postgres funciona, crie um andaime:

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

3) A partir rails 4.0.1da -d postgresqlopção gera um YAML que não inclui um parâmetro host. Eu achei que precisava disso. Edite a seção de desenvolvimento e crie os seguintes parâmetros:

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

Observe o databaseparâmetro for para uma base de dados que não sai ainda, e o usernamee passwordsão credenciais para um papel que não existe. Nós os criaremos mais tarde!

É assim que config/database.ymldeve ser (sem vergonha no 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) Inicie o shell do postgres com este comando:

$ psql

4a) Você pode receber esse erro se o usuário atual (como no usuário do computador) não tiver uma função correspondente do postgres de administração.

psql: FATAL:  role "your_username" does not exist

Agora eu instalei o postgres apenas uma vez, por isso posso estar errado aqui, mas acho que o postgres cria automaticamente uma função de administração com as mesmas credenciais do usuário em que você instalou o postgres.

4b) Portanto, isso significa que você precisa mudar para o usuário que instalou o postgres para usar o comando psql e iniciar o shell:

$ sudo su postgres

E então corra

$ psql

5) Você saberá que está no shell do postgres porque seu terminal ficará assim:

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

postgres=# 

6) Usando a sintaxe do PostgreSQL, vamos criar o usuário que especificado em config/database.yml's desenvolvimento seção:

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

Agora, há algumas sutilezas aqui, então vamos examiná-las.

  • O nome de usuário da função, thisismynewusername , não possui aspas de nenhum tipo ao seu redor
  • Especifique a palavra-chave LOGIN após o WITH . Caso contrário, a função ainda será criada, mas não poderá efetuar login no banco de dados!
  • A senha da função, thisismynewpassword , precisa estar entre aspas simples. Não são aspas duplas .
  • Adicione um ponto e vírgula no final;)

Você deve ver isso no seu terminal:

postgres=#
CREATE ROLE
postgres=#

Isso significa "ROLE CREATED", mas os alertas do postgres parecem adotar as mesmas convenções imperativas do git hub.

7) Agora, ainda no shell do postgres, precisamos criar o banco de dados com o nome que definimos no YAML. Torne o usuário que criamos na etapa 6 seu proprietário:

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

Você saberá se teve êxito porque obterá a saída:

CREATE DATABASE

8) Saia do shell do postgres:

\q

9) Agora, o momento da verdade:

$ RAILS_ENV=development rake db:migrate

Se você receber isso:

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

Parabéns, o postgres está funcionando perfeitamente com seu aplicativo.

9a) Na minha máquina local, recebi um erro de permissão. Não me lembro exatamente, mas foi um erro na linha de

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

Embora eu deva aconselhar a pensar com muito cuidado em definir recursivas vantagens de gravação em uma máquina de produção, localmente, dei a todo o meu aplicativo privilégios de gravação de leitura como este:

9b) Suba um nível de diretório:

$ cd ..

9c) Defina as permissões do diretório my_application e todo o seu conteúdo para 666:

$ chmod -R 0666 my_application

9d) E execute a migração novamente:

$ RAILS_ENV=development rake db:migrate

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

Algumas dicas e truques se você estragar tudo

Experimente estes antes de reiniciar todos estes passos:

O usuário mynewusername não tem privilégios para CRUD no my_app_developmentbanco de dados? Solte o banco de dados e crie-o novamente com mynewusername como proprietário:

1) Inicie o shell do postgres:

$ psql

2) Solte o my_app_developmentbanco de dados. Seja cuidadoso! Soltar significa excluir totalmente!

postgres=# DROP DATABASE my_app_development;

3) Recrie outro my_app_developmente faça de mynewusername o proprietário:

postgres=# CREATE DATABASE my_application_development OWNER mynewusername;

4) Saia do shell:

postgres=# \q

o mynewusername usuário não pode fazer login no banco de dados? Pense que você escreveu a senha errada no YAML e não consegue se lembrar da senha digitada usando o shell do postgres? Simplesmente altere a função com a senha YAML:

1) Abra sua YAML e copie a senha na sua área de transferência:

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

2) Inicie o shell do postgres:

$ psql    

3) Atualize mynewusernamea senha. Cole a senha e lembre-se de colocar aspas simples:

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;

4) Saia do shell:

postgres=# \q

Tentando conectar-se ao host local através de um visualizador de banco de dados, como o Dbeaver, e não sabe qual é a senha do usuário do postgres? Altere assim:

1) Execute passwdcomo superusuário:

$ sudo passwd postgres

2) Digite a senha da sua conta para sudo(nada a ver com o postgres):

[sudo] password for starkers: myaccountpassword

3) Crie o novo passwod da conta do postgres:

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

Recebendo esta mensagem de erro ?:

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) Você precisa dar ao usuário a capacidade de criar bancos de dados. No shell psql:

ALTER ROLE thisismynewusername WITH CREATEDB
Starkers
fonte
1
Eu gostaria de poder lhe dar mais +1 para esta solução brilhante, ficaria ainda mais feliz se funcionasse para mim. resposta ainda brilhante. pergunta rápida, esses backticks em torno da senha estão em uma função diferente? Além disso, você não precisa usar backticks mais cedo, precisa?
Mike HR
@ MikeH-R Obrigado, pena que isso não funciona para você! Você tem certeza de que seu YAML relevante possui host: localhost? Essa foi a verdadeira pegadinha para mim. Em torno da senha, você precisa de aspas simples. No meu teclado, isso é shift+ @. Com o shell psql, você só precisa de aspas simples em torno de alguns parâmetros. Você precisa deles em torno da senha, e não em torno do nome da função, por exemplo. É muito complicados para ser honesto, mas sim uma vez você sabe que é nuances :)
Starkers
@ MikeH-R Ajustei minha resposta para tornar as coisas mais claras. Considere ter outro problema!
Starkers 14/02
resolvido agora, obrigado novamente por uma resposta brilhante; a maioria das outras respostas que encontrei foram sobre a redução da segurança, o que obviamente não é bom na produção.
Mike HR
29

Para solução permanente:

O problema está no seu pg_hba. Está linha:

local   all             postgres                                peer

Deveria estar

local   all             postgres                                md5

Em seguida, reinicie o servidor postgresql após alterar este arquivo.

Se você estiver no Linux, o comando seria

sudo service postgresql restart
Sumit Munot
fonte
1
Obrigado! Esta é a verdadeira resposta.
Skipunkerin
9

Eu estava enfrentando o mesmo problema na máquina Ubuntu, então removi esse erro seguindo algumas etapas. Alterne para o usuário do postgres

$ sudo su - postgres

ele solicitará a senha e, por padrão, a senha é postgres

Depois de mudar o usuário para o postgres, abra o console psql

$ psql

então verifique a versão do postgres se houver várias versões disponíveis

psql=# select VERSION();

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

Agora Aberto postgres user

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

9.1 é o comando superior do formulário de retorno de versão

e substitua

local   all             postgres                                peer

para

local   all             postgres                                md5

Reinicie o serviço

sudo service postgresql restart

Eu escrevo etapas no meu blog também

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

Tarun Garg
fonte
Você deu a resposta certa, perdeu apenas uma coisa que não precisa verificar a versão. Você pode alterar a senha executando este comando após o psql Alter user "nome de usuário" definir a senha 'xyz';
vishu
Lembre-se de que a md5autenticação requer uma senha não nula para o usuário do seu banco de dados (apenas hoje isso é possível ao tentar maximizar a preguiça ao criar um aplicativo Rails).
Mark Leighton Fisher
5

Você pode acessar o seu arquivo /var/lib/pgsql/data/pg_hba.conf e adicionar confiança no lugar do Ident It que funcionou para mim.

local   all all trust
host    all 127.0.0.1/32    trust

Para obter detalhes adicionais, consulte este problema. Falha na autenticação da identidade do usuário

Rastee
fonte
Centos 6.6, tente:/var/lib/pgsql/9.2/data/pg_hba.conf
Patrick
4

Adicionando host: localhostfoi a mágica para mim

development:
  adapter: postgresql
  database: database_name_here
  host: localhost
  username: user_name_here
ispirett
fonte
0

Se você receber essa mensagem de erro ( Peer authentication failed for user (PG::Error)) ao executar testes de unidade, verifique se o banco de dados de testes existe.

David Winiecki
fonte
0

Também enfrentei esse mesmo problema enquanto trabalhava no meu ambiente de desenvolvimento. O problema era que deixei host: localhostcomentários noconfig/database.yml arquivo.

Portanto, meu aplicativo não pôde se conectar ao banco de dados PostgreSQL, simplesmente descomentando o problema.

development:
  <<: *default
  database: database_name

  username: database_username 

  password: database_password

  host: localhost

Isso é tudo.

Eu espero que isso ajude

Promise Preston
fonte