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

127

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

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"

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

  • 2
    возможный дубликат аутентификации PG Peer не удался
  • 0
    Теперь, чтобы быть запрошены ответы на поставленные выше вопросы , которые необходимо добавить --interactive к команде: createuser --interactive joe
Теги:

8 ответов

213

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
  • 14
    Мне нужно (версия 9.4): psql -U user-name -h 127.0.0.1 -d db-name
  • 8
    что за злобный инструмент. в руководстве написано: psql [option...] [dbname [username]] , так что можно подумать, что psql dbname username просто подойдет
Показать ещё 4 комментария
153

Не удалось подключиться, потому что по умолчанию 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_Какие комментарии включены в ответ.

  • 5
    Как вы разрешаете peer AND md5 ? Когда я устанавливаю md5 , я больше не могу войти с помощью пользователя postgres ! Я попытался добавить несколько строк и разделить метод запятыми, но они не сработали. Хорошо, я нашел mgoldwasser , и это сработало. Я просто добавил еще одну строку для пользователя postgres с методом peer !
  • 3
    Не волнуйтесь, вы можете установить одноранговую аутентификацию для определенных пользователей (например, ваше имя пользователя или postgres). Кажется, что определенные правила переопределяют общие правила
Показать ещё 4 комментария
30

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

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

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

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

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

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
19

В то время как ответ @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

10

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

sudo -u username psql
  • 0
    работает, только если вы создаете нового пользователя в системе И в postgres - hsming просто хочет подключиться к postgres с вновь созданным пользователем postgres, dev .
5

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

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

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

$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
  • 0
    Это может произойти автоматически, если у вас более одной установки postgres.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню