когда я создаю нового пользователя, но он не может войти в базу данных.
Я так делаю:
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"
Я попытался решить проблему, но не смог.
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
psql [option...] [dbname [username]]
, так что можно подумать, что psql dbname username
просто подойдет
Не удалось подключиться, потому что по умолчанию 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_Какие комментарии включены в ответ.
peer
AND md5
? Когда я устанавливаю md5
, я больше не могу войти с помощью пользователя postgres
! Я попытался добавить несколько строк и разделить метод запятыми, но они не сработали. Хорошо, я нашел mgoldwasser
, и это сработало. Я просто добавил еще одну строку для пользователя postgres
с методом peer
!
Одноранговая аутентификация означает, что postgres запрашивает операционную систему для вашего имени входа и использует ее для аутентификации. Чтобы войти в качестве пользователя "dev" с использованием одноранговой аутентификации в postgres, вы также должны быть "dev" пользователя в операционной системе.
Подробные сведения о методах проверки подлинности можно найти в документации Postgresql.
Подсказка: Если метод аутентификации больше не работает, отключите сервер от сети и используйте метод "trust" для "localhost" (и дважды проверьте, что ваш сервер недоступен через сеть, а метод "доверие" включено).
dev
на системного пользователя XXX
При указании:
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
В то время как ответ @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
Это работает для меня, когда я сталкиваюсь с ним:
sudo -u username psql
dev
.
Самое простое решение:
CREATE USER dev WITH PASSWORD 'dev';
CREATE DATABASE test_development;
GRANT ALL PRIVILEGES ON DATABASE test_development to dev;
ALTER ROLE dev CREATEROLE CREATEDB;
В моем случае я использовал другой порт. По умолчанию 5432. Я использовал 5433. Это сработало для меня:
$ psql -f update_table.sql -d db_name -U db_user_name -h 127.0.0.1 -p 5433
--interactive
к команде:createuser --interactive joe