Ошибка аутентификации PG Peer

У меня есть пользователь с паролем, который соответствует указанному в database.yml

postgres=# select * from pg_user
;
  usename   | usesysid | usecreatedb | usesuper | usecatupd | userepl |  passwd  | valuntil | useconfig 
------------+----------+-------------+----------+-----------+---------+----------+----------+-----------
 goodsounds |    16386 | t           | t        | t         | t       | ******** |          | 
 postgres   |       10 | t           | t        | t         | t       | ******** |          | 
(2 rows)

Это ошибка

[email protected] ~/rails_projects/goodsounds.org $ rake db:create
FATAL:  Peer authentication failed for user "goodsounds"

Вот мой pg_hba.conf:

# Database administrative login by Unix domain socket
local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     peer
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            trust
#host    replication     postgres        ::1/128                 trust

Ранее "доверие" выше было md5, но я изменил его, чтобы увидеть, поможет ли это.

Вот моя database.yml:

# PostgreSQL. Versions 8.2 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On Mac OS X with macports:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
development:
  adapter: postgresql
  encoding: unicode
  database: goodsounds_development
  pool: 5
  username: goodsounds
  password: test

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  host: localhost
  port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # The server defaults to notice.
  #min_messages: warning

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: postgresql
  encoding: unicode
  database: goodsounds_test
  pool: 5
  username: goodsounds
  password: test

production:
  adapter: postgresql
  encoding: unicode
  database: goodsounds_production
  pool: 5
  username: goodsounds
  password: test

Ответ 1

"Точная аутентификация" означает, что он использует сокет unix и ожидает, что подключаемый пользователь unix будет иметь одно и то же имя пользователя unix в качестве имени пользователя postgresql.

Поскольку ваше местное имя пользователя unix равно funkdified, и вы пытаетесь подключиться как пользователь goodsounds к соединению сокета unix domain (local), где ваш pg_hba.conf указывает peer аутентификацию, Pg правильно отклоняет ваш попытка соединения.

Это поведение по умолчанию для многих установок при использовании сокетов unix.

Вы можете:

  • Подключитесь через TCP/IP, указав имя хоста в настройках подключения к базе данных;
  • edit pg_hba.conf использовать md5 аутентификацию паролем вместо peer аутентификации для unix-сокетов (тип соединения local), поэтому Pg принимает аутентификацию пароля; или
  • Соединитесь с именем пользователя PostgreSQL так же, как ваше имя пользователя unix, и создайте пользователя в PostgreSQL, если он еще не существует.

Смотрите документы для pg_hba.conf и оставшуюся часть главы проверки подлинности клиента документации.

Обратите внимание, что изменения в pg_hba.conf не вступают в силу немедленно, вы должны перезапустить или хотя бы перезагрузить PostgreSQL, чтобы перечитать его pg_hba.conf.


О, также, если у вас установлено несколько версий PostgreSQL, у вас может быть libpq из одной версии и сервера из другого. В этом случае убедитесь, что место для unix-сокета, к которому подключается libpq по умолчанию, совпадает с сервером unix_socket_directories или переопределяет его (например,) host=/tmp в вашей строке подключения.

Ответ 2

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

Ответ 3

Если "одноранговая аутентификация" не работает, попробуйте аутентификацию md5.

Чтобы указать хост, попробуйте что-то вроде этого:

 psql -d <dbname> -U <username> -h <hostname>

или это:

 psql -d <dbname> -U <username> -h <hostname> -W

Ответ 4

изменить/etc/postgresql/9.3/main/pg_hba.conf

# "local" is for Unix domain socket connections only
    local   all             all                                     peer

измените строку ниже, и она работает для меня

# "local" is for Unix domain socket connections only
local   all             all                                     md5