Rails 3.2, FATAL: одноранговая аутентификация для пользователя не удалась (PG :: Error)

127

Я запускаю свою разработку на Ubuntu 11.10 и RubyMine

Вот мои настройки для database.yml: какой RubyMine создан для меня

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
Теги:
ruby-on-rails-3
ruby-on-rails-3.1
ubuntu-11.10

6 ответов

266
Лучший ответ

Если вы установили postresql на свой сервер, тогда просто запустите: localhost в database.yml, я обычно бросаю его туда, где он говорит пул: 5. В противном случае, если он не localhost определенно скажет это приложение, где его найти.

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

Убедитесь, что учетные данные пользователя установлены правильно, создав базу данных и назначив правообладателю пользователю вашего приложения, чтобы установить соединение. Чтобы создать нового пользователя в postgresql 9 run:

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 после того, как вы подтвердите создание базы данных, пользователя, пароля и установите эти привилегии. Не забудьте host: localhost.

  • 2
    если у вас по-прежнему возникают проблемы с входом в систему и установлением соединения через localhost, затем вернитесь в postgresql через терминал и примените некоторые из этих 8.2 соглашений для установления привилегий подключаемого пользователя, синтаксис GRANT ALL ON DATABASE от [dbname] до [usrname]. Этот синтаксис работает на psql 9+ точно так же, но вы, вероятно, можете переключать разрешения только для баз данных, принадлежащих пользователю, прежде чем он ВЫДАЕТ ВСЕ: postgresql.org/docs/8.2/static/sql-grant.html
  • 32
    host: localhost и pool: 5 отсутствовали в моей конфигурации. После их добавления ошибка исчезла.
Показать ещё 5 комментариев
50

Это самый надежный способ заставить ваше приложение rails работать с postgres в среде разработки в Ubuntu 13.10.

1) Создайте приложение rails с помощью postgres YAML и жемчуга "pg" в Gemfile:

$ 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 (без стыда в 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) Запустите оболочку postgres с помощью этой команды:

$ psql

4a) Вы можете получить эту ошибку, если ваш текущий пользователь (как у вашего пользователя компьютера) не имеет соответствующей роли postgres администрации.

psql: FATAL:  role "your_username" does not exist

Теперь я только установил postgres один раз, поэтому я могу ошибаться здесь, но я думаю, postgres автоматически создает роль администрирования с теми же учетными данными, что и пользователь, который вы установили postgres as.

4b) Итак, это означает, что вам нужно перейти на пользователя, который установил postgres, чтобы использовать команду psql и запустить оболочку:

$ sudo su postgres

И затем запустите

$ psql

5) Вы узнаете, что находитесь в оболочке postgres, потому что ваш терминал будет выглядеть следующим образом:

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

postgres=# 

6) Используя синтаксис postgresql, создайте пользователя, указанного в разделе config/database.yml development:

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

Теперь здесь есть несколько тонкостей, поэтому отпустите их.

  • В имени пользователя роли, thisismynewusername, нет нет кавычек вокруг него
  • Укажите ключевое слово LOGIN после WITH. Если вы этого не сделаете, роль все равно будет создана, но она не сможет войти в базу данных!
  • Пароль роли, thisismynewpassword, должен быть в одинарных кавычках. Не двойные кавычки.
  • Добавьте конец двоеточия в конец;)

Вы должны увидеть это в своем терминале:

postgres=#
CREATE ROLE
postgres=#

Это означает, что "ROLE CREATED", но оповещения postgres, похоже, принимают те же самые императивные соглашения от концентратора git.

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) Поднимитесь на один уровень каталога:

$ 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 не имеет привилегий для CRUD для базы данных my_app_development? Отбросьте базу данных и создайте ее с помощью 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

Попытка подключиться к localhost через средство просмотра базы данных, такое как Dbeaver, и не знаете, какой у вас пароль пользователя 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
ALTER ROLE thisismynewusername WITH CREATEDB
  • 1
    Хотел бы я дать вам еще +1 с за это блестящее решение, я был бы еще счастливее, если бы оно сработало для меня. все еще блестящий ответ. Небольшой вопрос, эти пометки вокруг пароля в другой роли? Кроме того, вам не нужно использовать backticks раньше, не так ли?
  • 0
    @ MikeH-R Спасибо, позор, это не работает для вас! Вы уверены, что в вашем соответствующем YAML есть host: localhost ? Это было для меня настоящим хитом. Вокруг пароля вам нужны одинарные кавычки. На моей клавиатуре это shift + @ . С оболочкой psql вам нужны только одинарные кавычки вокруг некоторых параметров. Они нужны вам, например, вокруг пароля, а не имени роли. Честно говоря, это очень странно, но хорошо, когда узнаешь, что это нюансы :)
Показать ещё 2 комментария
27

Для постоянного решения:

Проблема с вашим pg_hba. Эта строка:

local   all             postgres                                peer

Должно быть

local   all             postgres                                md5

Затем перезапустите сервер postgresql после изменения этого файла.

Если вы работаете в Linux, команда будет

sudo service postgresql restart
  • 1
    Спасибо! Это настоящий ответ.
6

Я столкнулся с такой же проблемой на машине 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

  • 0
    Вы дали правильный ответ, пропустили только то, что вам не нужно проверять версию. Вы можете изменить пароль, выполнив эту команду после того, как psql Alter user "username" установит пароль 'xyz';
  • 0
    Помните, что для аутентификации md5 необходим ненулевой пароль для пользователя вашей базы данных (только что получил это сегодня, пытаясь максимизировать лень при создании приложения Rails).
5

Вы можете перейти в файл /var/lib/pgsql/data/pg _hba.conf и добавить доверие вместо Ident Это сработало для меня.

local   all all trust
host    all 127.0.0.1/32    trust

Для получения дополнительной информации обратитесь к этой проблеме Ошибка идентификации пользователя для пользователя

  • 0
    Centos 6.6, попробуйте: /var/lib/pgsql/9.2/data/pg_hba.conf
0

Если вы получите это сообщение об ошибке (Peer authentication failed for user (PG::Error)) при выполнении модульных тестов, убедитесь, что существует тестовая база данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню