Psql: FATAL: Ошибка аутентификации сверстников для пользователя "dev"

когда я создаю нового пользователя, но он не может войти в базу данных.
Я так делаю:

[email protected]:/home/XXX$ createuser dev
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y

затем создайте базу данных:

[email protected]:/home/XXX$ createdb -O dev test_development

после этого, я пробую psql -U dev -W test_development для входа в систему, но получаю сообщение об ошибке:

psql: FATAL:  Peer authentication failed for user "dev"

Я попытался решить проблему, но не смог.

Ответ 1

Try:

psql user_name  -h 127.0.0.1 -d db_name

где

  • -h - имя хоста /IP локального сервера, что позволяет избежать сокетов домена Unix
  • -d - это имя базы данных для подключения к

Затем это оценивается как "сетевое" соединение Postgresql, а не соединение сокета домена Unix, поэтому не оценивается как "локальное" соединение, как вы можете видеть в pg_hba.conf:

local   all             all                                     peer

Ответ 2

Не удалось подключиться, потому что по умолчанию psql подключается через UNIX-сокеты с использованием аутентификации peer, для которой текущий пользователь UNIX должен иметь то же имя пользователя, что и psql. Поэтому вам нужно будет создать пользователя UNIX dev, а затем войти как dev или использовать sudo -u dev psql test_development для доступа к базе данных (и psql должен не запрашивать пароль).

Если вы не можете или не хотите создавать пользователя UNIX, например, если вы просто хотите подключиться к своей базе данных для специальных запросов, принудительное подключение сокета с помощью psql --host=localhost --dbname=test_development --username=dev (как указано в ответе @meyerson) решит ваша непосредственная проблема.

Но если вы намерены принудительно вводить аутентификацию паролем через сокеты Unix вместо метода peer, попробуйте изменить следующую строку pg_hba.conf *:

от

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          peer

к

# TYPE DATABASE USER ADDRESS METHOD
local  all      all          md5
  • peer означает, что он будет доверять личности (подлинности) пользователя UNIX. Поэтому не запрашивать пароль.

  • md5 означает, что он всегда будет запрашивать пароль и проверять его после хэширования с помощью md5.

Вы также можете создавать более конкретные правила для конкретной базы данных или пользователя, а некоторые пользователи имеют peer и другие, требующие пароли.

После изменения pg_hba.conf, если PostgreSQL запущен, вам нужно будет перепроверить конфигурацию путем перезагрузки (pg_ctl reload) или перезапустить (sudo service postgresql restart).

* Файл pg_hba.conf, скорее всего, будет находиться в /etc/postgresql/9.x/main/pg_hba.conf

Отредактировано: Заметки из @Chloe, @JavierEH, @Jonas Eicher, @fccoelho, @Joanis, @Uphill_Какие комментарии включены в ответ.

Ответ 3

Одноранговая аутентификация означает, что postgres запрашивает операционную систему для вашего имени входа и использует ее для аутентификации. Чтобы войти в качестве пользователя "dev" с использованием одноранговой аутентификации в postgres, вы также должны быть "dev" пользователя в операционной системе.

Подробные сведения о методах проверки подлинности можно найти в документации Postgresql.

Подсказка: Если метод аутентификации больше не работает, отключите сервер от сети и используйте метод "trust" для "localhost" (и дважды проверьте, что ваш сервер недоступен через сеть, а метод "доверие" включено).

Ответ 4

При указании:

psql -U user

он подключается через UNIX Socket, который по умолчанию использует аутентификацию peer, если не указано иначе pg_hba.conf.

Вы можете указать:

host    database             user             127.0.0.1/32       md5
host    database             user             ::1/128            md5

чтобы получить соединение TCP/IP в интерфейсе loopback (как IPv4, так и IPv6) для указанных database и user.

После изменений вам необходимо перезапустить postgres или перезагрузить его конфигурацию. Перезапуск, который должен работать в современных дистрибутивах RHEL/Debian:

service postgresql restart

Перезагрузка должна работать следующим образом:

pg_ctl reload

но команда может отличаться в зависимости от конфигурации PATH - вам может потребоваться указать абсолютный путь, который может быть другим, в зависимости от способа установки postgres.

Затем вы можете использовать:

psql -h localhost -U user -d database

чтобы войти с этим user в указанный database через TCP/IP. md5 означает зашифрованный пароль, в то время как вы можете также указать password для паролей с открытым текстом во время авторизации. Эти 2 варианта не должны иметь большого значения, поскольку сервер базы данных доступен только локально, без доступа к сети.

Важное примечание: Порядок определения в pg_hba.conf имеет значение - правила читаются сверху вниз, например iptables, поэтому вы, вероятно, захотите добавить предлагаемые правила выше правила:

host    all             all             127.0.0.1/32            ident

Ответ 5

В то время как ответ @flaviodesousa будет работать, он также обязывает всех пользователей (всех остальных) вводить пароль.

Иногда имеет смысл поддерживать равноправную аутентификацию для всех остальных, но сделать исключение для пользователя службы. В этом случае вам нужно добавить строку в pg_hba.conf, которая выглядит так:

local   all             some_batch_user                         md5

Я бы рекомендовал вам добавить эту строку прямо под прокомментированной строкой заголовка:

# TYPE  DATABASE        USER            ADDRESS                 METHOD
local   all             some_batch_user                         md5

Вам нужно будет перезапустить PostgreSQL, используя

sudo service postgresql restart

Если вы используете 9.3, ваш pg_hba.conf, скорее всего, будет:

/etc/postgresql/9.3/main/pg_hba.conf

Ответ 6

Это работает для меня, когда я сталкиваюсь с ним:

sudo -u username psql

Ответ 7

Самое простое решение:

CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;

Ответ 8

В моем случае я использовал другой порт. По умолчанию 5432. Я использовал 5433. Это сработало для меня:

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433

Ответ 9

Для людей, которые postgres это в будущем, postgres находится в /usr/lib/postgresql/10/bin на моем сервере Ubuntu.

Я добавил его в PATH в моем файле .bashrc и добавил эту строку в конце

PATH=$PATH:/usr/lib/postgresql/10/bin

затем в командной строке

$> source ./.bashrc

Я обновил мою среду Bash. Теперь я могу использовать postgres -D/wherever из любого каталога

Ответ 10

Я просто должен был добавить -h localhost