Сохраним исходный файл настроек.
postgres$ cp -n /usr/local/pgsql/data/pg_hba.conf pg_hba.conf.orig
Теперь перезапишем pg_hba.conf с нуля:
postgres$ echo 'local all postgres trust' > /usr/local/pgsql/data/pg_hba.conf
postgres$ echo 'host all all all md5' >> /usr/local/pgsql/data/pg_hba.conf
=> SELECT line_number, type, database, user_name, address, auth_method FROM pg_hba_file_rules;
line_number | type | database | user_name | address | auth_method -------------+-------+----------+------------+---------+------------- 1 | local | {all} | {postgres} | | trust 2 | host | {all} | {all} | all | md5 (2 rows)
=> SELECT pg_reload_conf();
pg_reload_conf ---------------- t (1 row)
=> SHOW password_encryption;
password_encryption --------------------- md5 (1 row)
=> CREATE ROLE alice LOGIN PASSWORD 'alice';
CREATE ROLE
=> SET password_encryption='scram-sha-256';
SET
=> CREATE ROLE bob LOGIN PASSWORD 'bob';
CREATE ROLE
Поскольку настройки требуют ввода пароля, мы укажем его явно в строке подключения.
При выполнении этого задания лучше ввести пароль вручную, чтобы убедиться в том, что он запрашивается.
=> \c "dbname=postgres user=alice host=localhost password=alice"
You are now connected to database "postgres" as user "alice" on host "localhost" at port "5432".
=> \c "dbname=postgres user=bob host=localhost password=bob"
You are now connected to database "postgres" as user "bob".
=> \q
postgres$ psql
=> SELECT rolname, rolpassword FROM pg_authid WHERE rolname IN ('alice','bob') \gx
-[ RECORD 1 ]-------------------------------------------------------------------------------------------------------------------------------------- rolname | alice rolpassword | md5579e43b423b454623383471aeb85cd87 -[ RECORD 2 ]-------------------------------------------------------------------------------------------------------------------------------------- rolname | bob rolpassword | SCRAM-SHA-256$4096:LJSJCEAao8rYQ2l+UtPqbg==$7YlL1mVri2SGvLopDPy7AMCCMkvCdh8Qr8PENh43UQw=:eEGzsFJo22F5NDagf1IyLf1aqMGrVRbM/xIwfxS6MTM=
Пароли хранятся как значение хеш-функции, не допускающее расшифровки. Сервер всегда сравнивает между собой зашифрованные значения - введенный пароль и значение из pg_authid.
postgres$ cp pg_hba.conf.orig /usr/local/pgsql/data/pg_hba.conf
=> SELECT pg_reload_conf();
pg_reload_conf ---------------- t (1 row)