Rails: FATAL - uwierzytelnianie peera nie powiodło się dla użytkownika (PG :: Error)


143

Programuję na Ubuntu 11.10 i RubyMine

Oto moje ustawienia programistyczne dla database.yml: które RubyMine stworzył dla mnie

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

kiedy próbuję uruchomić aplikację, pojawia się ten błąd poniżej, wygląda na to, że nie utworzyłem jeszcze użytkownika „projektu”, ale jak mogę utworzyć użytkownika i nadać mu bazę danych w postgres? jeśli to jest problem, jakie narzędzie jest zalecane do tego zadania w Ubuntu? jeśli to nie jest problem, proszę o poradę.

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

Odpowiedzi:


315

Jeśli zainstalowałeś postresql na swoim serwerze, to po prostu host: localhost do database.yml, zwykle wrzucam go tam, gdzie jest napisane pool: 5. W przeciwnym razie, jeśli nie jest to localhost, zdecydowanie powiedz tej aplikacji, gdzie ma znaleźć swoją bazę danych.

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

Upewnij się, że poświadczenia użytkownika są poprawnie ustawione, tworząc bazę danych i przypisując prawo własności do użytkownika aplikacji w celu nawiązania połączenia. Aby utworzyć nowego użytkownika w postgresql 9, uruchom:

sudo -u postgres psql

ustaw hasło użytkownika postgresql, jeśli go nie masz, to tylko hasło z ukośnikiem odwrotnym.

postgres=# \password

Utwórz nowego użytkownika i hasło oraz nową bazę danych użytkownika:

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

Teraz zaktualizuj plik database.yml po potwierdzeniu utworzenia bazy danych, użytkownika, hasła i ustawieniu tych uprawnień. Nie zapomnij host: localhost.


2
Jeśli nadal masz problemy z zalogowaniem się i zakończeniem połączenia przez localhost, wróć do postgresql przez terminal i zastosuj niektóre konwencje 8.2 w celu ustalenia uprawnień łączącego się użytkownika, składnia to GRANT ALL ON DATABASE [dbname] do [usrname]. Ta składnia działa na psql 9+ tak samo, ale prawdopodobnie możesz przełączać uprawnienia tylko do baz danych należących do użytkownika, zanim UDZIELI WSZYSTKICH: postgresql.org/docs/8.2/static/sql-grant.html
Bent Cardan

38
host: localhosti pool: 5brakowało w mojej konfiguracji. Po ich dodaniu błąd zniknął.
Amit Patel

21
Dla mnie host: localhostbrakowało. po dodaniu wszystko działało. To jest w Ubuntu 13.04
Jesse

7
Również ważne, aby podkreślić: NIE ZAPOMNIJ O PÓŁKOLONACH .
Maarten

Osobiście uważam, że ważne jest, aby móc uruchomić konfigurację z rake db: setup. W przeciwnym razie wystąpią problemy z wygenerowaniem nowego środowiska wdrażania, ale ten opis działa w przypadku środowiska programistycznego.
Ashley Raiteri

54

Jest to najbardziej niezawodny sposób, aby aplikacja rails działała z postgres w środowisku programistycznym w Ubuntu 13.10.

1) Utwórz aplikację railsową z postgres YAML i gemem „pg” w Gemfile:

$ rails new my_application -d postgresql

2) Daj mu jakąś funkcjonalność CRUD. Jeśli tylko widzisz, czy postgres działa, utwórz rusztowanie:

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

3) Jak w rails 4.0.1tej -d postgresqlopcji generuje YAML który nie zawiera parametru hosta. Odkryłem, że tego potrzebuję. Edytuj dział rozwoju i utwórz następujące parametry:

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

Zwróć uwagę, że databaseparametr jest przeznaczony dla bazy danych, która nie została jeszcze zamknięta, a usernamei passwordsą poświadczeniami dla roli, która również nie istnieje. Stworzymy je później!

Tak config/database.ymlpowinno wyglądać (bez wstydu w 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) Uruchom powłokę postgres za pomocą tego polecenia:

$ psql

4a) Możesz otrzymać ten błąd, jeśli Twój aktualny użytkownik (tak jak użytkownik Twojego komputera) nie ma odpowiedniej roli administracyjnej postgres.

psql: FATAL:  role "your_username" does not exist

Teraz zainstalowałem postgres tylko raz, więc mogę się mylić, ale myślę, że postgres automatycznie tworzy rolę administracyjną z tymi samymi poświadczeniami, co użytkownik, którego zainstalowałeś.

4b) Oznacza to, że musisz zmienić użytkownika, który zainstalował postgres, aby użyć polecenia psql i uruchomić powłokę:

$ sudo su postgres

A potem biegnij

$ psql

5) Będziesz wiedział, że jesteś w powłoce postgres, ponieważ twój terminal będzie wyglądał tak:

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

postgres=# 

6) za pomocą składni PostgreSQL, stwórzmy użytkownikowi my określonego w config/database.yml„s rozwoju sekcji:

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

Teraz jest tu kilka subtelności, więc przejdźmy do nich.

  • W nazwie użytkownika roli, thisismynewusername , nie ma żadnych cudzysłowów
  • Podaj słowo kluczowe LOGIN po znaku WITH . Jeśli tego nie zrobisz, rola nadal zostanie utworzona, ale nie będzie można zalogować się do bazy danych!
  • Hasło roli, to jest moje nowe hasło, musi być zapisane w pojedynczych cudzysłowach. Nie cudzysłowy .
  • Dodaj średnik na końcu;)

Powinieneś zobaczyć to w swoim terminalu:

postgres=#
CREATE ROLE
postgres=#

To znaczy „UTWORZONO ROLĘ”, ale alerty postgres wydają się przyjmować te same imperatywne konwencje git hub.

7) Teraz, nadal w powłoce postgres, musimy stworzyć bazę danych o nazwie, którą ustawiliśmy w YAML. Ustaw użytkownika, którego utworzyliśmy w kroku 6, jako jego właściciela:

postgres=# CREATE DATABASE my_application_development OWNER thisismynewusername;

Dowiesz się, czy ci się udało, ponieważ otrzymasz wynik:

CREATE DATABASE

8) Zamknij powłokę postgres:

\q

9) Teraz chwila prawdy:

$ RAILS_ENV=development rake db:migrate

Jeśli otrzymasz to:

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

Gratulacje, postgres doskonale współpracuje z Twoją aplikacją.

9a) Na moim komputerze lokalnym ciągle otrzymywałem błąd uprawnień. Nie pamiętam dokładnie, ale był to błąd podobny do

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

Chociaż radziłbym bardzo uważnie przemyśleć rekurencyjne ustawianie priorytetów zapisu na maszynie produkcyjnej, lokalnie nadałem całej mojej aplikacji uprawnienia do odczytu zapisu w następujący sposób:

9b) W górę o jeden poziom katalogu:

$ cd ..

9c) Ustaw uprawnienia katalogu my_application i całą jego zawartość na 666:

$ chmod -R 0666 my_application

9d) I ponownie uruchom migrację:

$ RAILS_ENV=development rake db:migrate

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

Kilka wskazówek i sztuczek, jeśli się pomylisz

Wypróbuj te czynności przed ponownym uruchomieniem wszystkich tych kroków:

Użytkownik mynewusername nie ma uprawnień do CRUD do my_app_developmentbazy danych? Usuń bazę danych i utwórz ją ponownie z mynewusername jako właścicielem:

1) Uruchom powłokę postgres:

$ psql

2) Usuń my_app_developmentbazę danych. Bądź ostrożny! Upuść oznacza całkowite usunięcie!

postgres=# DROP DATABASE my_app_development;

3) Odtwórz inną my_app_developmenti ustaw moją nową nazwę użytkownika jako właściciela:

postgres=# CREATE DATABASE my_application_development OWNER mynewusername;

4) Zamknij powłokę:

postgres=# \q

mynewusernameUżytkownik nie może się zalogować do bazy danych? Myślisz, że wpisałeś nieprawidłowe hasło w YAML i nie pamiętasz hasła, które wprowadziłeś za pomocą powłoki postgres? Po prostu zmień rolę za pomocą hasła YAML:

1) Otwórz YAML i skopiuj hasło do schowka:

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

2) Uruchom powłokę postgres:

$ psql    

3) mynewusernameHasło aktualizacji . Wklej hasło i pamiętaj o umieszczeniu wokół niego pojedynczych cudzysłowów:

postgres=# ALTER ROLE mynewusername PASSWORD `musthavebeenverydrunkwheniwrotethis`;

4) Zamknij powłokę:

postgres=# \q

Próbujesz połączyć się z hostem lokalnym za pośrednictwem przeglądarki bazy danych, takiej jak Dbeaver i nie wiesz, jakie jest hasło użytkownika postgres? Zmień to w ten sposób:

1) Uruchom passwdjako superużytkownik:

$ sudo passwd postgres

2) Wprowadź hasło do swojego konta sudo(nie ma to nic wspólnego z postgres):

[sudo] password for starkers: myaccountpassword

3) Utwórz nowe hasło do konta postgres:

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

Otrzymujesz ten komunikat o błędzie ?:

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) Musisz dać swojemu użytkownikowi możliwość tworzenia baz danych. Z powłoki psql:

ALTER ROLE thisismynewusername WITH CREATEDB

1
Chciałbym móc dać Ci więcej +1 za to genialne rozwiązanie. Byłbym jeszcze szczęśliwszy, gdyby to zadziałało. wciąż genialna odpowiedź. szybkie pytanie, czy te grawerunki wokół hasła mają zmienną rolę? nie musisz też wcześniej używać grawisów, prawda?
Mike HR

@ MikeH-R Dzięki, szkoda, że ​​to nie działa! Czy na pewno Twój odpowiedni YAML ma host: localhost? To był dla mnie prawdziwy chwyt. Wokół hasła potrzebujesz pojedynczych cudzysłowów. Na mojej klawiaturze to shift+ @. W powłoce psql potrzebujesz tylko pojedynczych cudzysłowów wokół niektórych parametrów. Potrzebujesz ich wokół hasła, a nie na przykład nazwy roli. Szczerze mówiąc, jest to bardzo skomplikowane, ale w porządku, gdy już wiesz, że to niuanse :)
Starkers

@ MikeH-R Poprawiłem moją odpowiedź, aby wszystko było jaśniejsze. Zastanów się nad kolejną próbą!
Starkers

rozwiązałem to teraz, jeszcze raz dziękuję za genialną odpowiedź, większość innych odpowiedzi, które napotkałem, dotyczyła poluzowania zabezpieczeń, co oczywiście nie jest dobre w produkcji.
Mike HR

29

Trwałe rozwiązanie:

Problem dotyczy twojego pg_hba. Ta linia:

local   all             postgres                                peer

Powinien być

local   all             postgres                                md5

Następnie uruchom ponownie serwer postgresql po zmianie tego pliku.

Jeśli korzystasz z Linuksa, polecenie byłoby

sudo service postgresql restart

1
Dziękuję Ci! To jest prawdziwa odpowiedź.
skplunkerin

9

Napotkałem ten sam problem na komputerze z systemem Ubuntu, więc usunąłem ten błąd, wykonując kilka czynności. Przełącz się na użytkownika postgres

$ sudo su - postgres

zapyta o hasło i domyślnie hasło to postgres

Po przełączeniu użytkownika na postgres, otwórz konsolę psql

$ psql

więc sprawdź wersję postgres, jeśli dostępnych jest wiele wersji

psql=# select VERSION();

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

Teraz otwarte postgres user

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

9.1 jest wersją zwracaną z górnej komendy

i wymień

local   all             postgres                                peer

do

local   all             postgres                                md5

Uruchom ponownie usługę

sudo service postgresql restart

Piszę również kroki na swoim blogu

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


Podałeś poprawną odpowiedź, przegapiłeś tylko jedną rzecz, której nie musisz sprawdzać wersji. Możesz zmienić hasło, uruchamiając to polecenie po psql Zmień użytkownika "nazwa użytkownika" ustaw hasło 'xyz';
vishu

Pamiętaj, że md5uwierzytelnianie wymaga niezerowego hasła dla użytkownika bazy danych (właśnie zostało przez to dzisiaj pobite, próbując zmaksymalizować lenistwo podczas tworzenia aplikacji Railsowej).
Mark Leighton Fisher


4

Dodawanie host: localhostbyło dla mnie magią

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

0

Jeśli pojawi się ten komunikat o błędzie ( Peer authentication failed for user (PG::Error)) podczas uruchamiania testów jednostkowych, upewnij się, że baza danych testowych istnieje.


0

Z tym samym problemem spotkałem się również podczas pracy w swoim środowisku programistycznym, problem polegał na tym, że zostawiłem host: localhostkomentarz w config/database.ymlpliku.

Więc moja aplikacja nie mogła połączyć się z bazą danych PostgreSQL, po prostu odkomentowanie jej rozwiązało problem.

development:
  <<: *default
  database: database_name

  username: database_username 

  password: database_password

  host: localhost

To wszystko.

mam nadzieję, że to pomoże

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.