psql: FATAL: неудачная аутентификация для пользователя «dev»


198

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

postgres@Aspire:/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

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

postgres@Aspire:/home/XXX$ createdb -O dev test_development

после этого я пытаюсь psql -U dev -W test_developmentвойти, но получаю ошибку:

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

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



Теперь для получения ответов на поставленные выше вопросы необходимо добавить --interactiveв команду:createuser --interactive joe
user3791372

Ответы:


310

Пытаться:

psql -U user_name  -h 127.0.0.1 -d db_name

где

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

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

local   all             all                                     peer

15
Мне нужно (версия 9.4): psql -U user-name -h 127.0.0.1 -d db-name
Грегор

9
что за злобный инструмент. в руководстве написано psql [option...] [dbname [username]], что можно подумать, psql dbname usernameчто это сработает ..
djeikyb

2
У меня тоже сработало. Я также думаю, что это гораздо более предпочтительный способ, чем изменение конфигурационных файлов, особенно если у вас нет понятия о том, что вы делаете, и просто следуйте SO-ответу, чтобы решить вашу проблему.
Борисано

1
это сработало для меня, большое спасибо, хотя я делаю исследование, почему это было правильное решение. тем не менее, в конфигурации на другой машине я бы вошел как psql -U username -d database. так что я думаю, что принятое решение зависит от случая.
Лазарь Восход

2
Хороший ответ. Я получал из базы данных после того, как вошел как postgres, а \c glossary john FATAL: Peer authentication failed for user "john"затем с \c glossary john localhost Password for user john: SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off) You are now connected to database "glossary" as user "john" on host "localhost" at port "5432".ним работал.
посмотрите

215

Ваше соединение не удалось, потому что по умолчанию 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 вместо однорангового метода, попробуйте изменить следующую 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_What комментарии включены в ответ.


5
Как вы разрешаете peer И md5 ? Когда я установил md5, я больше не могу войти с postgresпользователем! Я попытался добавить несколько строк и разделить метод запятыми, но они не сработали. Хорошо, я нашел mgoldwasserответ, и это сработало. Я просто добавил еще одну строку для пользователя postgresс методом peer!
Хлоя

3
Не волнуйтесь, вы можете установить одноранговую аутентификацию для определенных пользователей (например, ваше имя пользователя или postgres). Кажется, что определенные правила переопределяют общие правила
JavierIEH

1
В некоторых дистрибутивах файл также можно найти здесь:/var/lib/pgsql/9.4/data/pg_hba.conf
Jonas Eicher

2
Вы не можете сделать это без перезапуска postgresql? Вы не можете просто указать метод аутентификации в таблице pg_user?
fccoelho

2
Вы можете перезагрузить вместо перезагрузки. Это перезагрузит таблицу pg_hba. Работал на меня.
Джоанис

29

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

Вы можете найти подробную информацию о методах аутентификации в документации Postgresql .

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


1
спасибо за ваши ответы. но это все еще не работает, если я изменяю на devсистемного пользователяXXX
hsming

2
Ответ Стефана правильный. Я просто добавил ссылку, которая будет видна при просмотре моего редактирования, в документации, где объясняется каждый из методов аутентификации.
дш

25

Когда вы указываете:

psql -U user

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

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

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

получить соединение TCP / IP по интерфейсу обратной связи (как 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

Важное примечание: - порядок важен +1
ястребиный глаз

23

Хотя ответ @ 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


12

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

sudo -u username psql

работает только если создать целый новый пользователь в системе и в Postgres - hsming просто хочет подключиться к Postgres с вновь созданным пользователем Postgres, dev.
Кеннет

8

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

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

6

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


Моя проблема заключалась в использовании postgres на малину. ^^^ работал на меня! Спасибо!
Tidydee

2

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

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

Это может произойти автоматически, если у вас есть несколько установок postgres.
Galigator

1

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

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

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

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

$> source ./.bashrc

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.