关于连接PostgreSQL时提示 FATAL: password authentication failed for user "连接用户名" 的解决办法

前端之家收集整理的这篇文章主要介绍了关于连接PostgreSQL时提示 FATAL: password authentication failed for user "连接用户名" 的解决办法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

关于连接Postgresql提示FATAL:passwordauthenticationFailedforuser"连接用户名"的解决方法
今天帮一个同学解决了一个FATAL:passwordauthenticationFailedforuser"连接用户名"的错误问题,下面说说一下我遇过这个问题的以往排除方法

一、密码忘记了,输入不正确

[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Upostgres
Passwordforuserpostgres:
psql:FATAL:passwordauthenticationFailedforuser"postgres"

解决方法
1、编辑pg_hba.conf,将md5认证修改成trust认证,编辑后退出保存

[postgres@pgsqldb-masterbin]$vi../data/pg_hba.conf

2、执行pg_ctlreload加载生效
[postgres@pgsqldb-masterbin]$exportPGPORT=5432
[postgres@pgsqldb-masterbin]$exportPGDATE=postgres
[postgres@pgsqldb-masterbin]$exportPGDATA=/pgdata/avx/data
[postgres@pgsqldb-masterbin]$exportPGUSER=postgres
[postgres@pgsqldb-masterbin]$exportPATH=/pgdata/avx/bin:$PATH
[postgres@pgsqldb-masterbin]$pg_ctlreload
serversignaled

3、psql连接,用alterrole修改密码
[postgres@pgsqldb-masterbin]$psql
psql(9.2.3)
Type"help"forhelp.

postgres=#alterrolepostgreswithpassword'123';
ALTERROLE
postgres=#

4、退出psql
5、编辑pg_hba.conf,将turst认证修改成md5认证,编辑后退出保存
6、执行pg_ctlreload加载生效

二、密码过期了(今天解决在就是这个),下面来看一下实验

设置用户的密码有效期至2013-01-01

postgres=#alterrolepostbbswithpassword'123'validuntil'2013-01-01';
ALTERROLE
postgres=#\psetxon
Expandeddisplayison.
postgres=#SELECT*FROMpg_rolesWHERErolname='postbbs';
-[RECORD1]--+-----------------------
rolname|postbbs
rolsuper|f
rolinherit|t
rolcreaterole|f
rolcreatedb|f
rolcatupdate|f
rolcanlogin|t
rolreplication|f
rolconnlimit|-1
rolpassword|********
rolvaliduntil|2013-01-0100:00:00+08
rolconfig|
oid|16425

postgres=#

postgres=#\q
[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Upostbbs-dpostgres
Passwordforuserpostbbs:输入密码123虽然正确,但不能登录进去
psql:FATAL:passwordauthenticationFailedforuser"postbbs"
[postgres@pgsqldb-masterbin]$

我们现在再修改回来

[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Upostgres
Passwordforuserpostgres:
psql(9.2.3)
Type"help"forhelp.

postgres=#alterrolepostbbswithvaliduntil'infinity';
ALTERROLE
postgres=#\psetxon
Expandeddisplayison.
postgres=#SELECT*FROMpg_rolesWHERErolname='postbbs';
-[RECORD1]--+---------
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-masterbin]$psql-h127.0.0.1-Upostbbs-dpostgres
Passwordforuserpostbbs:
psql(9.2.3)
Type"help"forhelp.

postgres=>
postgres=#SELECTrolvaliduntilFROMpg_rolesWHERErolname='postbbs';
rolvaliduntil
---------------
infinity
(1row)

postgres=#


a、alterrolepostbbswithvaliduntil'infinity';密码永远有效
b、如果所有用户的密码全部过期,这里也需要将认证修改成trust再进入,再修改生效日期才行

另外我发现pgadmin角色管理有一个bug,当密码的有限期设置成空或者infinity时,在pgadmin角色管理里面会显示成1970-1-1,如果这时我们用pgadmin角色管理窗口修改其它参数时,则rolvaliduntil值会变成1970-1-1,结果退出后就无法进行认证了,所以用pgadmin角色管理窗口进行参数设置时一定要注意了,例如用窗口设置用户变成管理员,则语句会变成

105243255.jpg





ALTERROLEpostbbs
SUPERUSER
VALIDUNTIL'1970-01-0100:00:00';



三、采用密码文件认证,但里面的密码是错误的,则会出现如下的提示

[postgres@pgsqldb-masterbin]$cat/home/postgres/.pgpass
127.0.0.1:5432:*:postgres:1234
[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Upostgres-dpostgres
psql:FATAL:passwordauthenticationFailedforuser"postgres"
passwordretrievedfromfile"/home/postgres/.pgpass"

解决方法
1、修改.pgpass文件,将密码修改正确,注意,linux下.pgpass的访问权限要设置成0600

2、如果用户无法修改密码文件,则连接时加-W,强制输入密码

[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Upostgres-dpostgres-W
Passwordforuserpostgres:
psql(9.2.3)
Type"help"forhelp.

postgres=#

四、低级错误用户名不存在

[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Uposgres-dpostgres-W
Passwordforuserposgres:
psql:FATAL:passwordauthenticationFailedforuser"posgres"
[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-UpostGres-dpostgres-W
PasswordforuserpostGres:
psql:FATAL:passwordauthenticationFailedforuser"postGres"

这样的大头虾错误不看清楚往往更难发现,注意用户名也是区分大小写的

五、修改用户密码采用md5加密的用户名

[postgres@pgsqldb-masterbin]$psql-h127.0.0.1-Upostgres-dpostgres-W
Passwordforuserpostgres:
psql(9.2.3)
Type"help"forhelp.

postgres=#alterrolepostbbswithENCRYPTEDpassword'123';
ALTERROLE
postgres=#alterrolepostgreswithENCRYPTEDpassword'123';
ALTERROLE
postgres=#SELECTrolname,rolpasswordFROMpg_authid;
rolname|rolpassword
----------+-------------------------------------
postbbs|md5514d208ad0f8842c176b4836992f1cbb
postgres|md59df270eb52907fff723d9b8b7436113a
(2rows)

密码一样都是"123"不同用户名生成的md5编码也是不样的

postgres=#alterrolepostbbsrenametopostbbs_1;
NOTICE:MD5passwordclearedbecauSEOfrolerename
ALTERROLE
postgres=#SELECTrolname,rolpasswordFROMpg_authid;
rolname|rolpassword
-----------+-------------------------------------
postgres|md59df270eb52907fff723d9b8b7436113a
postbbs_1|
(2rows)

因为MD5加密的口令使用角色名字作为加密的盐粒,所以,如果口令是MD5加密的,那么给一个用户改名会清空其口令

更详细的说明http://www.postgresql.org/docs/9.2/static/sql-alterrole.html

postgres=#\cpostgrespostbbs_1
Passwordforuserpostbbs_1:
FATAL:passwordauthenticationFailedforuser"postbbs_1"
PrevIoUsconnectionkept

由于密码清空,所以也就无法认证

postgres=#alterrolepostbbs_1withUNENCRYPTEDpassword'123';
ALTERROLE
postgres=#SELECTrolname,rolpasswordFROMpg_authid;
rolname|rolpassword
-----------+-------------------------------------
postgres|md59df270eb52907fff723d9b8b7436113a
postbbs_1|123
(2rows)

postgres=#alterrolepostbbs_1renametopostbbs;
ALTERROLE
postgres=#SELECTrolname,rolpasswordFROMpg_authid;
rolname|rolpassword
----------+-------------------------------------
postgres|md59df270eb52907fff723d9b8b7436113a
postbbs|123
(2rows)

postgres=#\cpostgrespostbbs
Passwordforuserpostbbs:
Youarenowconnectedtodatabase"postgres"asuser"postbbs".
postgres=>

采用明码密码存储的话,修改前后密码保持不变,所以可以认证

所以修改MD5加密认证用户名时应采用这样的做法,这一点本人认为有些不友好,因为原来md5密码我们是不知道明文的

postgres=>\cpostgrespostgres
Passwordforuserpostgres:
Youarenowconnectedtodatabase"postgres"asuser"postgres".
postgres=#alterrolepostbbsrenametopostbbs_1;
ALTERROLE
postgres=#alterrolepostbbs_1withpassword'123';
ALTERROLE
postgres=#

六、一台主机上将了多个不同port的Postgresql服务,连接时指向的port不正确

[postgres@pgsqldb-masterbin]$psql-h192.168.1.100-Upostgres-dpostgres
Passwordforuserpostgres:
psql:FATAL:passwordauthenticationFailedforuser"postgres"

默认的5432port里面的用户postgres密码不是123

[postgres@pgsqldb-masterbin]$psql-h192.168.1.100-Upostgres-dpostgres-p9240
Passwordforuserpostgres:
psql(9.2.3,server9.2.4)
Type"help"forhelp.

postgres=#

port为9240的用户postgres密码才是123

这样的错误也是属于比较大头虾的错误

本文转自:http://www.myexception.cn/operating-system/1348177.html

猜你在找的Postgre SQL相关文章