Rails:FATAL-用户的对等身份验证失败(PG :: Error)

问题描述 投票:137回答:8

我正在Ubuntu 11.10和RubyMine上运行我的开发

这是我对database.yml的开发设置:RubyMine为我创建的设置

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

[当我尝试运行该应用程序时,出现以下错误,似乎我还没有创建'project'用户,但是,如何在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
ruby-on-rails postgresql ruby-on-rails-3 ruby-on-rails-3.1 ubuntu-11.10
8个回答
302
投票

如果您在服务器上安装了postresql,则仅将host:localhost托管到database.yml,我通常将其放置在其显示pool:5的地方。否则,如果不是localhost,则肯定告诉该应用程序在哪里找到其数据库。

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。


53
投票

这是在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参数用于尚未退出的数据库,usernamepassword是也不存在的角色的凭据。我们稍后将创建它们!

这是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 shell:

$ psql

4a)如果您当前的用户(如您的计算机用户)没有相应的管理postgres角色,则可能会出现此错误。

psql: FATAL:  role "your_username" does not exist

现在我只安装了一次postgres,所以在这里我可能错了,但是我认为postgres会自动创建一个管理角色,其凭据与安装postgres的用户相同。

4b)因此,这意味着您需要更改为安装postgres的用户才能使用psql命令并启动Shell:

$ sudo su postgres

然后运行

$ psql

5)您将知道您在postgres shell中,因为您的终端将如下所示:

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

postgres=# 

6)使用postgresql语法,让我们创建在config/database.ymldevelopment部分中指定的用户:

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

[现在,这里有一些微妙之处,让我们来看一下。

  • 角色的用户名,thisismynewusername没有周围带有任何引号
  • 在[之后指定关键字登录。如果您不这样做,那么仍将创建该角色,但它将无法登录数据库!
  • 角色的密码,
  • thisismynewpassword
  • ,必须用单引号引起来。 非双引号。在末尾添加半冒号;)
  • 您应该在终端中看到此内容:

    postgres=# CREATE ROLE postgres=#

    这意味着,“角色已创建”,但postgres的警报似乎采用了git hub相同的命令式约定。

    7)现在,仍然在postgres shell中,我们需要使用在YAML中设置的名称创建数据库。使我们在第6步中创建的用户成为所有者:

    postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

    您会知道您是否成功,因为您将获得输出:

    CREATE DATABASE

    8)退出postgres shell:

    \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)爬升一个目录级别:

    $ 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 shell:

    $ 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 shell输入的密码吗?只需使用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 shell:

    $ 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 shell:

    ALTER ROLE thisismynewusername WITH CREATEDB


  • 29
    投票
    对于永久解决方案:

    问题出在您的pg_hba。这行:

    local all postgres peer

    应该是

    local all postgres md5

    然后在更改此文件后重新启动您的Postgresql服务器。 

    如果您使用的是Linux,则命令为

    sudo service postgresql restart


    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

    to

    local all postgres md5

    重新启动服务

    sudo service postgresql restart

    我也在博客上写了步骤

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


    5
    投票
    您可以转到/var/lib/pgsql/data/pg_hba.conf文件并添加信任来代替Ident它为我工作。

    local all all trust host all 127.0.0.1/32 trust

    有关更多详细信息,请参阅此问题Ident authentication failed for user

    3
    投票
    添加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

    就这些。

    我希望这会有所帮助

    © www.soinside.com 2019 - 2024. All rights reserved.