Rails: FATAL - невдала аутентифікація для користувачів (PG :: Помилка)


143

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

Ось мої налаштування розробки для database.yml: які RubyMine створив для мене

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

Коли я намагаюся запустити додаток, я отримую цю помилку нижче, здається, що я ще не створив користувача «проекту», але як я можу створити користувача та надати йому базу даних у постграфах? якщо це проблема, то який же рекомендований інструмент використовувати в 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 to 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 після підтвердження створення бази даних, користувача, пароля та встановлення цих привілеїв. Не забувайте господаря: localhost.


2
якщо у вас все ще виникають проблеми з входом у систему та завершенням з'єднання через localhost, тоді поверніться до postgresql через термінал і застосуйте деякі ці 8.2 умови для встановлення привілеїв вашого підключеного користувача, синтаксис ВІДПОВІДУЄ ВСЕ НА ДАТАБАЗІ [dbname] до [usrname]. Цей синтаксис працює на psql 9+ точно так само, але ви, ймовірно, можете змінювати дозволи лише на базах даних, що належать користувачеві, перш ніж він надасть ВСІ: postgresql.org/docs/8.2/static/sql-grant.html
Bent Cardan

38
host: localhostі не pool: 5було в моїй конфігурації. Після їх додавання помилка зникла.
Аміт Патель

21
Для мене host: localhostбракувало. після того, як я додав, що все працювало. Це в Ubuntu 13.04
Jesse

7
Також важливо наголосити: НЕ ЗАБУДУЙТЕ СЕМИКОЛОНИ .
Маартен

Особисто я думаю, що важливо мати можливість запускати налаштування за допомогою rake db: setup. Інакше у вас виникнуть проблеми із створенням нового середовища розгортання, але цей опис працює для середовища розробки.
Ешлі Райтері

54

Це самий нерозумний спосіб змусити ваш додаток рейлів працювати з postgres в середовищі розробки в Ubuntu 13.10.

1) Створіть програму рейлів із постгресами 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має виглядати (не соромно при копіпасті: 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) Ви можете отримати цю помилку, якщо у вашого поточного користувача (як у користувача вашого комп’ютера) немає відповідної ролі адміністративної пошти.

psql: FATAL:  role "your_username" does not exist

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

4b) Отже, це означає, що вам потрібно змінити користувача, який встановив postgres, щоб використовувати команду psql та запустити оболонку:

$ sudo su postgres

А потім біжи

$ psql

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

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

postgres=# 

6) Використовуючи синтаксис PostGreSQL, давайте створимо користувача ми , зазначені в config/database.yml«S розвитку розділу:

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

Тепер тут є деякі тонкощі, тож давайте переглянемо їх.

  • Ім'я користувача ролі, цеismynewusername , не має навколо себе жодних лапок
  • Вкажіть ключове слово LOGIN після WITH . Якщо цього не зробити, роль все одно буде створена, але вона не зможе увійти до бази даних!
  • Пароль ролі, цеismynewpassword , повинен бути в одній лапки. Не подвійні цитати .
  • Додайте півкільця на кінці;)

Ви повинні побачити це у своєму терміналі:

postgres=#
CREATE ROLE
postgres=#

Це означає, що "ROLE CREATED", але сповіщення про постгреси, здається, приймають ті самі імперативні умовності 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) Піднятися на один рівень каталогу:

$ 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базу даних. Будь обережний! Drop означає повністю видалити!

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

1
Я б хотів, щоб я міг дати вам більше +1 s за це геніальне рішення, я був би ще щасливішим, якби це працювало на мене. ще блискуча відповідь. швидке запитання, чи змінюються ті зворотні посилання навколо пароля? Крім того, вам не потрібно використовувати задні ранки раніше?
Майк HR

@ MikeH-R Дякую, сором, це не працює для тебе! Ви впевнені, що має відповідний YAML host: localhost? Це була справжня гатча для мене. Навколо пароля потрібні одиничні лапки. На моїй клавіатурі це shift+ @. З оболонкою psql вам потрібні лише окремі лапки навколо деяких параметрів. Вони потрібні вам навколо пароля, а не навколо імені ролі, наприклад. Дуже чесно, якщо бути чесним, але добре, як тільки ви знаєте, що це нюанси :)
Старкерс

@ MikeH-R Я налаштував свою відповідь, щоб зробити речі зрозумілішими. Подумайте, що у нього ще одна тріщина!
Старкерс

розібрав це зараз, ще раз дякую за блискучу відповідь, більшість інших відповідей, з якими я стикався, стосувалися послаблення безпеки, яка, очевидно, не є доброю у виробництві.
Майк 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

Після переключення користувача на постгрес відкрийте консоль 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 Змінити користувача "ім'я користувача" встановити пароль "xyz";
vishu

Пам’ятайте, що для md5автентифікації потрібен ненульовий пароль для користувача вашої бази даних (щойно отриманий таким чином сьогодні, намагаючись збільшити лінь при створенні програми aa Rails).
Марк Лейтон Фішер

5

Ви можете зайти у файл /var/lib/pgsql/data/pg_hba.conf і додати довіру замість ідентифікатора. Це працювало для мене.

local   all all trust
host    all 127.0.0.1/32    trust

Детальніші відомості див. У цій проблемі Не вдалося встановити автентифікацію особи для користувача


Centos 6.6, спробуйте:/var/lib/pgsql/9.2/data/pg_hba.conf
Патрік

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

Це все.

Я сподіваюся, що це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.