關於鏈接PostgreSQL時提示 FATAL: password authentication failed for user "鏈接用戶名" 的解決方法
今天幫一個同窗解決了一個FATAL: password authentication failed for user "鏈接用戶名" 的錯誤問題,下面說說一下我遇過這個問題的以往排除方法
1、密碼忘記了,輸入不正確
[postgres @ pgsqldb-master bin]$ psql -h 127.0.0.1 -U postgres
Password for user postgres:
psql: FATAL: password authentication failed for user "postgres"
解決方法
一、編輯pg_hba.conf,將md5認證修改爲trust認證,編輯後退出保存
[postgres @ pgsqldb-master bin]$ vi ../data/pg_hba.conf
二、執行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
三、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=#
四、退出psql
五、編輯pg_hba.conf,將turst認證修改爲md5認證,編輯後退出保存
六、執行pg_ctl reload加載生效
2、密碼過時了(今天解決在就是這個),下面來看一下實驗
設置用戶的密碼有效期至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';
3、採用密碼文件認證,但裏面的密碼是錯誤的,則會出現以下的提示
[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"
解決方法
一、修改.pgpass文件,將密碼修改正確,注意,linux下.pgpass的訪問權限要設置成 0600
二、若是用戶沒法修改密碼文件,則鏈接時加-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=#
4、低級錯誤,用戶名不存在
[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"
這樣的大頭蝦錯誤不看清楚每每更難發現,注意用戶名也是區分大小寫的
5、修改了用戶密碼採用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=#
6、一臺主機上將了多個不一樣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
這樣的錯誤也是屬於比較大頭蝦的錯誤html