關於連線PostgreSQL時提示 FATAL: password authentication failed for user "連線使用者名稱" 的解決辦法
關於連線PostgreSQL時提示 FATAL: password authentication failed for user "連線使用者名稱" 的解決方法
今天幫一個同學解決了一個FATAL: password authentication failed for user "連線使用者名稱" 的錯誤問題,下面說說一下我遇過這個問題的以往排除方法
一、密碼忘記了,輸入不正確
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
psql: FATAL: password authentication failed for user "postgres"
解決方法
1、編輯pg_hba.conf,將md5認證修改成trust認證,編輯後退出儲存
[postgres @ pgsqldb-master bin]$ vi ../data/pg_hba.conf
2、執行pg_ctl reload載入生效
[postgres @ pgsqldb-master bin]$ export PGPORT=5432
[postgres @ pgsqldb-master bin]$ export PGDATE=postgres
[postgres @ pgsqldb-master bin]$ export PGDATA=/pgdata/avx/data
[postgres @ pgsqldb-master bin]$ export PGUSER=postgres
[postgres @ pgsqldb-master bin]$ export PATH=/pgdata/avx/bin:$PATH
[postgres @ pgsqldb-master bin]$ pg_ctl reload
server signaled
3、psql連線,用alter role修改密碼
[postgres @ pgsqldb-master bin]$ psql
psql (9.2.3)
Type "help" for help.
postgres=# alter role postgres with password '123';
ALTER ROLE
postgres=#
4、退出psql
5、編輯pg_hba.conf,將turst認證修改成md5認證,編輯後退出儲存
6、執行pg_ctl reload載入生效
二、密碼過期了(今天解決在就是這個),下面來看一下實驗
設定使用者的密碼有效期至2013-01-01
postgres=# alter role postbbs with password '123' valid until '2013-01-01';
ALTER ROLE
postgres=# \pset x on
Expanded display is on.
postgres=# SELECT * FROM pg_roles WHERE rolname='postbbs';
-[ RECORD 1 ]--+-----------------------
rolname | postbbs
rolsuper | f
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcatupdate | f
rolcanlogin | t
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil | 2013-01-01 00:00:00+08
rolconfig |
oid | 16425
postgres=#
postgres=# \q
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postbbs -d postgres
Password for user postbbs:輸入密碼123 雖然正確,但不能登入進去
psql: FATAL: password authentication failed for user "postbbs"
[postgres @ pgsqldb-master bin]$
我們現在再修改回來
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
psql (9.2.3)
Type "help" for help.
postgres=# alter role postbbs with valid until 'infinity';
ALTER ROLE
postgres=# \pset x on
Expanded display is on.
postgres=# SELECT * FROM pg_roles WHERE rolname='postbbs';
-[ RECORD 1 ]--+---------
rolname | postbbs
rolsuper | f
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcatupdate | f
rolcanlogin | t
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil | infinity
rolconfig |
oid | 16425
postgres=# \q
[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postbbs -d postgres
Password for user postbbs:
psql (9.2.3)
Type "help" for help.
postgres=>
postgres=# SELECT rolvaliduntil FROM pg_roles WHERE rolname='postbbs';
rolvaliduntil
---------------
infinity
(1 row)
postgres=#
注
a、alter role postbbs with valid until 'infinity'; 密碼永遠有效
b、如果所有使用者的密碼全部過期,這裡也需要將認證修改成trust再進入,再修改生效日期才行
另外我發現pgadmin角色管理有一個bug,當密碼的有限期設定成空或者 infinity 時,在pgadmin角色管理裡面會顯示成 1970-1-1 ,如果這時我們用pgadmin角色管理視窗修改其它引數時,則rolvaliduntil 值會變成 1970-1-1,結果退出後就無法進行認證了,所以用pgadmin 角色管理視窗進行引數設定時一定要注意了,例如用視窗設定使用者變成管理員,則語句會變成
ALTER ROLE postbbs
SUPERUSER
VALID UNTIL '1970-01-01 00:00:00';
三、採用密碼檔案認證,但裡面的密碼是錯誤的,則會出現如下的提示
[postgres @ pgsqldb-master bin]$ cat /home/postgres/.pgpass
127.0.0.1:5432:*:postgres:1234
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres -d postgres
psql: FATAL: password authentication failed for user "postgres"
password retrieved from file "/home/postgres/.pgpass"
解決方法
1、修改.pgpass檔案,將密碼修改正確,注意,linux下.pgpass的訪問許可權要設定成 0600
2、如果使用者無法修改密碼檔案,則連線時加-W,強制輸入密碼
[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres -d postgres -W
Password for user postgres:
psql (9.2.3)
Type "help" for help.
postgres=#
四、低階錯誤,使用者名稱不存在
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U posgres -d postgres -W
Password for user posgres:
psql: FATAL: password authentication failed for user "posgres"
[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postGres -d postgres -W
Password for user postGres:
psql: FATAL: password authentication failed for user "postGres"
這樣的大頭蝦錯誤不看清楚往往更難發現,注意使用者名稱也是區分大小寫的
五、修改了使用者密碼採用md5加密的使用者名稱
[postgres@pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres -d postgres -W
Password for user postgres:
psql (9.2.3)
Type "help" for help.
postgres=# alter role postbbs with ENCRYPTED password '123';
ALTER ROLE
postgres=# alter role postgres with ENCRYPTED password '123';
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
----------+-------------------------------------
postbbs | md5514d208ad0f8842c176b4836992f1cbb
postgres | md59df270eb52907fff723d9b8b7436113a
(2 rows)
密碼一樣都是 "123" 不同使用者名稱,生成的md5編碼也是不樣的
postgres=# alter role postbbs rename to postbbs_1;
NOTICE: MD5 password cleared because of role rename
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
-----------+-------------------------------------
postgres | md59df270eb52907fff723d9b8b7436113a
postbbs_1 |
(2 rows)
因為MD5加密的口令使用角色名字作為加密的鹽粒,所以, 如果口令是MD5加密的,那麼給一個使用者改名會清空其口令
更詳細的說明 http://www.postgresql.org/docs/9.2/static/sql-alterrole.html
postgres=# \c postgres postbbs_1
Password for user postbbs_1:
FATAL: password authentication failed for user "postbbs_1"
Previous connection kept
由於密碼清空,所以也就無法認證
postgres=# alter role postbbs_1 with UNENCRYPTED password '123';
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
-----------+-------------------------------------
postgres | md59df270eb52907fff723d9b8b7436113a
postbbs_1 | 123
(2 rows)
postgres=# alter role postbbs_1 rename to postbbs;
ALTER ROLE
postgres=# SELECT rolname,rolpassword FROM pg_authid;
rolname | rolpassword
----------+-------------------------------------
postgres | md59df270eb52907fff723d9b8b7436113a
postbbs | 123
(2 rows)
postgres=# \c postgres postbbs
Password for user postbbs:
You are now connected to database "postgres" as user "postbbs".
postgres=>
採用明碼密碼儲存的話,修改前後密碼保持不變,所以可以認證
所以修改MD5加密認證使用者名稱時應採用這樣的做法,這一點本人認為有些不友好,因為原來md5密碼我們是不知道明文的
postgres=> \c postgres postgres
Password for user postgres:
You are now connected to database "postgres" as user "postgres".
postgres=# alter role postbbs rename to postbbs_1;
ALTER ROLE
postgres=# alter role postbbs_1 with password '123';
ALTER ROLE
postgres=#
六、一臺主機上將了多個不同port的Postgresql服務,連線時指向的port不正確
[postgres @ pgsqldb-master bin]$ psql -h 192.168.1.100 -U postgres -d postgres
Password for user postgres:
psql: FATAL: password authentication failed for user "postgres"
預設的5432 port裡面的使用者postgres密碼不是123
[postgres@pgsqldb-master bin]$ psql -h 192.168.1.100 -U postgres -d postgres -p 9240
Password for user postgres:
psql (9.2.3, server 9.2.4)
Type "help" for help.
postgres=#
port 為9240的使用者postgres 密碼才是123
這樣的錯誤也是屬於比