Rails:FATAL-ユーザーのピア認証が失敗しました(PG :: Error)


143

Ubuntu 11.10とRubyMineで開発を実行しています

RubyMineが作成したdatabase.ymlの開発設定は次のとおりです

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

アプリを実行しようとすると、以下のエラーが表示されます。「プロジェクト」ユーザーをまだ作成していないようですが、ユーザーを作成してpostgresにデータベースを付与するにはどうすればよいですか。これが問題の場合、Ubuntuでこのタスクに使用する推奨ツールは何ですか?これが問題でない場合は、アドバイスをお願いします。

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

回答:


315

サーバーにpostresqlをインストールした場合は、ホスト:localhostからdatabase.ymlまで、通常はプールと言う場所に投げ込みます。

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

データベースを作成し、接続を確立するためにアプリのユーザーに所有権を割り当てて、ユーザーの認証情報が正しく設定されていることを確認します。postgresql 9で新しいユーザーを作成するには、次のコマンドを実行します。

sudo -u postgres psql

設定していない場合は、postgresqlユーザーパスワードを設定します。これは、バックスラッシュパスワードです。

postgres=# \password

新しいユーザーとパスワード、およびユーザーの新しいデータベースを作成します。

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

データベース、ユーザー、パスワードの作成を確認し、これらの権限を設定したら、database.ymlファイルを更新します。ホストを忘れないでください:localhost。


2
ログインしてlocalhost経由で接続を完了できない場合は、ターミナルからpostgresqlに戻り、これらの8.2の規則を適用して接続ユーザーの権限を確立します。構文はGRANT ALL ON DATABASE [dbname] to [usrname]です。この構文はpsql 9+でもまったく同じように機能しますが、すべてを許可する前に、ユーザーが所有するデータベースの権限のみを切り替えることができます。postgresql.org
docs

38
host: localhostpool: 5私の設定で欠落していた。追加後、エラーが消えました。
Amit Patel

21
私にとってhost: localhost欠けていました。追加した後、すべてが機能しました。これはUbuntu 13.04にあります
Jesse

7
強調することも重要です:セミコロンを忘れないでください
Maarten

個人的には、rake db:setupでセットアップを実行できることが重要だと思います。そうしないと、新しいデプロイメント環境を生成するときに問題が発生しますが、この説明は開発環境で機能します。
Ashley Raiteri 2014年

54

これは、Ubuntu 13.10の開発環境でRailsアプリをpostgresで動作させる最も簡単な方法です。

1)Gemfileでpostgres YAMLと 'pg' gemを使用してrailsアプリを作成します。

$ rails new my_application -d postgresql

2)CRUD機能をいくつか提供します。postgresが機能するかどうかを確認しているだけの場合は、足場を作成します。

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

3)オプションの時点でrails 4.0.1-d postgresqlホストパラメーターを含まないYAMLが生成されます。私はこれが必要だとわかりました。開発セクションを編集し、次のパラメーターを作成します。

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

databaseパラメータはまだ存在しないデータベース用であり、usernameおよびpasswordは存在しないロールの資格情報であることに注意してください。後で作成します!

これはどのようにconfig/database.yml見えるべきかです(コピーペースト: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)次のコマンドでpostgresシェルを起動します:

$ psql

4a)現在のユーザー(コンピューターユーザーなど)に対応する管理postgresロールがない場合、このエラーが発生することがあります。

psql: FATAL:  role "your_username" does not exist

今私は一度だけpostgresをインストールしたので、ここで間違っているかもしれませんが、postgresは、postgresをインストールしたユーザーと同じ資格情報で管理ロールを自動的に作成すると思います。

4b)つまり、psqlコマンドを使用してシェルを起動するには、postgresをインストールしたユーザーに変更する必要があります。

$ sudo su postgres

そして、実行します

$ psql

5)端末が次のようになるため、postgresシェルにいることがわかります。

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

postgres=# 

6)postgresql構文を使用して、config/database.yml開発セクションで指定したユーザーを作成してみましょう。

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

さて、ここにはいくつかの微妙な点があるので、それらについて見ていきましょう。

  • 役割のユーザ名、thisismynewusernameしません引用符があり
  • WITHの後にキーワードLOGINを指定します。そうしないと、ロールは作成されますが、データベースにログインできなくなります!
  • ロールのパスワードthisismynewpasswordは、単一引用符で囲む必要があります。二重引用符ではありません
  • 最後にセミコロンを追加します;)

あなたはあなたのターミナルでこれを見るはずです:

postgres=#
CREATE ROLE
postgres=#

つまり、「ROLE CREATED」ですが、postgresのアラートはgit hubと同じ強制的な規則を採用しているようです。

7)ここで、まだpostgresシェルで、YAMLで設定した名前でデータベースを作成する必要があります。手順6で作成したユーザーを所有者にします。

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

出力が得られるため、成功したかどうかがわかります。

CREATE DATABASE

8)postgresシェルを終了します。

\q

9)真実の瞬間:

$ RAILS_ENV=development rake db:migrate

これを取得した場合:

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

おめでとうございます。postgresはあなたのアプリで完璧に動作しています。

9a)ローカルマシンで、アクセス許可エラーが発生し続けました。正確には思い出せませんが、それは

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

ローカルで本番マシンに書き込み権限を再帰的に設定することについて慎重に検討することをお勧めしますが、アプリ全体に次のような読み取り書き込み権限を与えました。

9b)1つのディレクトリレベルに登る:

$ cd ..

9c)my_applicationディレクトリとそのすべてのコンテンツの権限を666に設定します。

$ chmod -R 0666 my_application

9d)そして移行を再度実行します:

$ RAILS_ENV=development rake db:migrate

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

マックした場合のヒントとコツ

これらの手順をすべて再開する前に、これらを試してください。

mynewusernameユーザーには、my_app_developmentデータベースをCRUDする権限がありませんか?データベースを削除し、mynewusernameを所有者として再度作成します。

1)postgresシェルを起動します。

$ psql

2)my_app_developmentデータベースをドロップします。注意してください!ドロップは完全に削除することを意味します!

postgres=# DROP DATABASE my_app_development;

3)別のものmy_app_developmentを再作成し、mynewusernameを所有者にします。

postgres=# CREATE DATABASE my_application_development OWNER mynewusername;

4)シェルを終了します。

postgres=# \q

mynewusernameユーザーがデータベースにログインすることはできませんか?YAMLで間違ったパスワードを書いて、postgresシェルを使用して入力したパスワードを完全に思い出せないと思いますか?YAMLパスワードで役割を変更するだけです。

1)YAMLを開き、パスワードをクリップボードにコピーします。

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

2)postgresシェルを起動します。

$ psql    

3)mynewusernameのパスワードを更新します。パスワードを貼り付け、一重引用符で囲むことを忘れないでください。

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;

4)シェルを終了します。

postgres=# \q

Dbeaverなどのデータベースビューアを介してlocalhostに接続しようとしていて、postgresユーザーのパスワードがわからない場合は、次のように変更します。

1)passwdスーパーユーザーとして実行:

$ sudo passwd postgres

2)アカウントのパスワードを入力しますsudo(postgresとは関係ありません):

[sudo] password for starkers: myaccountpassword

3)postgresアカウントの新しいパスワードを作成します。

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

このエラーメッセージを取得しますか?:

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)ユーザーがデータベースを作成できるようにする必要があります。psqlシェルから:

ALTER ROLE thisismynewusername WITH CREATEDB

1
この素晴らしい解決策のためにあなたにもっと+1を与えることができればいいのに、それが私のために働いたなら、私はさらに幸せになるでしょう。まだ素晴らしい答え。簡単な質問ですが、パスワードの周りのバッククォートは役割が変わりますか?また、以前にバックティックを使用する必要はありませんか?
マイクHR

@ MikeH-Rありがとうございます。残念ながら機能しません。関連するYAMLが本当にあるhost: localhostか?それは私にとって本当の落とし穴でした。パスワードの前後には一重引用符が必要です。私のキーボードではshift+ @です。psqlシェルでは、一部のパラメーターを囲む単一引用符のみが必要です。たとえば、ロールの名前ではなく、パスワードの周りにそれらを必要とします。正直言って非常に手間がかかりますが、ニュアンスだとわかったら大丈夫です:)
Starkers

@ MikeH-Rわかりやすくするために答えを微調整しました。別の亀裂があることを検討してください!
スターカーズ2014

整理しました。すばらしい回答をありがとう、私が遭遇した他のほとんどの回答は、セキュリティを緩めることに関するものでした。
Mike HR

29

恒久的な解決策の場合:

問題は、pg_hbaにあります。この行:

local   all             postgres                                peer

する必要があります

local   all             postgres                                md5

次に、このファイルを変更した後、postgresqlサーバーを再起動します。

Linuxを使用している場合、コマンドは次のようになります。

sudo service postgresql restart

1
ありがとうございました!これが本当の答えです。
skplunkerin

9

Ubuntuマシンでも同じ問題に直面していたため、いくつかの手順に従ってこのエラーを削除しました。postgresユーザーに切り替える

$ sudo su - postgres

パスワードを要求し、デフォルトのパスワードは postgres

ユーザーをpostgresに切り替えた後、psqlコンソールを開きます

$ psql

複数のバージョンが利用できる場合は、postgresのバージョンを確認してください

psql=# select VERSION();

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

開催中 postgres user

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

9.1 バージョン返却フォーム上位コマンドです

そして交換する

local   all             postgres                                peer

local   all             postgres                                md5

サービスを再起動します

sudo service postgresql restart

ブログにもステップを書いています

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


あなたは正しい答えを与えました、あなたはバージョンをチェックする必要のない一つだけを逃しました。パスワードを変更するには、psql Alter user "username" set password 'xyz'の後にこのコマンドを実行します。
vishu

md5認証にはデータベースユーザーのnull以外のパスワードが必要であることを覚えておいてください(今日、Railsアプリケーションを作成するときに遅延を最大化しようとしているときに少しだけ気付きました)。
マークレイトンフィッシャー

5

/var/lib/pgsql/data/pg_hba.confファイルに移動して、Ident Itの代わりに信頼を追加できます。

local   all all trust
host    all 127.0.0.1/32    trust

詳細については、この問題を参照してください。 ユーザーのID認証が失敗しました


Centos 6.6、試してみてください/var/lib/pgsql/9.2/data/pg_hba.conf
Patrick

4

追加host: localhostは私にとって魔法でした

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

0

Peer authentication failed for user (PG::Error)単体テストの実行中にそのエラーメッセージ()が表示された場合は、テストデータベースが存在することを確認してください。


0

開発環境で作業しているときにも同じ問題に直面host: localhostしましたconfig/database.yml。問題は、ファイル内でコメント化したままにしたことです。

そのため、私のアプリケーションはPostgreSQLデータベースに接続できませんでした。コメントを外すだけで問題は解決しました。

development:
  <<: *default
  database: database_name

  username: database_username 

  password: database_password

  host: localhost

それで全部です。

これが役に立てば幸い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.