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.