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