关于连接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角色管理窗口进行参数设置时一定要注意了,例如用窗口设置用户变成管理员,则语句会变成
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