Postgres密码验证失败

60

我尝试通过Pgadmin从我的Windows机器使用postgres用户登录到服务器,但一直出现以下错误:

psql: FATAL:  password authentication failed for user "postgres"

于是我尝试使用psql命令行登录,结果出现了相同的错误。然后我在pg_hba.conf中将本地条目设置为信任(trust),使用psql重置了密码为“test”。然后我将条目改回md5,并尝试使用密码“test”登录。

我在psql中使用了以下命令:

ALTER ROLE postgres WITH PASSWORD 'test';
ALTER ROLE postgres PASSWORD 'test';
ALTER USER postgres WITH PASSWORD 'test';
ALTER USER postgres PASSWORD 'test';

还有这个特殊的psql命令

\password

每次我将pg_hba.conf本地条目返回到md5,并尝试使用psql登录:

psql -U postgres

然后我被要求输入密码。输入'test'后,psql给出了我之前提到的相同错误。
当然,在每次更改pg_hba文件后,我都重新启动了postgresql。我正在使用'su postgres'运行psql。
所以,即使我能够按照通常的方式更改密码,它也不能被接受为密码。
我希望有人能帮助我解决这个问题。
一些信息:
Postgresql 9.1 Ubuntu 12.04
Pg_hba文件(如请求所示)
local   all             postgres                                md5

local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5

host    all             all             <my-ip-address>/32        md5

当我想要修改密码时,我将顶部的md5更改为trust。 需要提醒的是,在此之前这个配置一直没有问题。
结果为:
sudo -u postgres psql -x -c "select * from pg_user where usename='postgres'"

Are:

usename     | postgres
usesysid    | 10
usecreatedb | t
usesuper    | t
usecatupd   | t
userepl     | t
passwd      | ********
valuntil    | 1970-01-01 00:00:00+01
useconfig   |

你能把这个命令的结果加进去吗:sudo -u postgres psql -x -c "select * from pg_user where usename='postgres'" (以查看密码有效性信息) - Daniel Vérité
5个回答

79

根据最新编辑,密码有效期至1970年,这意味着它目前无效。 这解释了错误消息,与密码不正确时的错误消息相同。

使用以下方法重置有效期:

ALTER USER postgres VALID UNTIL 'infinity';

最近有另一个用户遇到了与用户帐户和PG-9.2相同的问题:

PostgreSQL - 添加组角色后密码验证失败

因此,似乎有一种无意中将虚假密码有效期设置为Unix纪元(1970年1月1日,abstime类型的最小可能值)的方法。 可能,在PG本身或某些客户端工具中存在错误会导致这种情况的出现。

编辑:原来是pgadmin的错误。请参见https://dba.stackexchange.com/questions/36137/


1
今天在PostgreSQL 9.2.3上,我遇到了“过期时间为unix时间0”的问题。这是使用PgAdmin创建的新用户。过去,我总是在psql中创建用户或使用createuser脚本创建用户。也许这与PgAdmin有关。 - Jonathan Fuerth
4
@Jonathan:是的,结果证明这是一个pgadmin的bug。请参见http://dba.stackexchange.com/questions/36137。 - Daniel Vérité
3
谢谢。我也是,我什么都没动……就这样浪费了三个小时。 - Jörg

11

我遇到了这个问题,在这里找到的答案对我没用,我想不出为什么我无法登录并得到上面的错误提示。

事实证明,PostgreSQL 将用户名保存为小写,但在验证期间它使用大小写字母的组合。

CREATE USER myNewUser WITH PASSWORD 'passWord';

将创建一个用户名为“mynewuser”和密码为“passWord”的用户。

这意味着您必须使用“mynewuser”进行身份验证,而不能使用“myNewUser”。对于像我这样的pgsql新手来说,这很令人困惑。我希望能帮助遇到这个问题的其他人。


1
为了避免可能的混淆:我在“在身份验证期间它同时使用大写和小写”这部分所指的是,在创建用户时,用户名会被转换为小写,但在身份验证期间不会,因此身份验证区分大小写。 - Marcovannoord
我已经为此苦思冥想了一个小时!谢谢! - iLoveTux

10

pg_hba.conf 条目通过 IP 地址定义登录方法。您需要显示相关部分的 pg_hba.conf 以获得适当的帮助。

更改此行:











host    all             all             <my-ip-address>/32        md5

为反映您的本地网络设置。因此,如果您的IP地址是192.168.16.78(C类),掩码为255.255.255.0,则输入以下内容:

host    all             all             192.168.16.0/24        md5

请确保您的WINDOWS机器在该网络 192.168.16.0 中,然后再尝试。


1
我已经添加了pg_hba.conf文件。这个文件基本上是默认的,只加了我的IP地址。 - milosa
糟糕,我本应该输入192.168.16.0/24而不是192.168.16.0/0。我已经编辑了答案进行更正。 - Pablo Santa Cruz
1
我应该补充说明一下,我的服务器不在本地网络中。此外,当我在Postgresql运行的同一台机器上使用psql时,问题也会出现。 - milosa

1
假设您拥有该服务器的root访问权限,您可以执行以下操作:
sudo -u postgres psql

如果在数据库中出现“postgres不存在”的情况,将会执行此代码块。
sudo -u postgres psql template1

然后使用sudo nano /etc/postgresql/11/main/pg_hba.conf命令打开文件

local   all         postgres                          ident

对于更新版本的PostgreSQL,ident实际上可能是peer。

在psql shell中,您可以为DB用户postgres设置密码:

ALTER USER postgres PASSWORD 'newPassword';

0

我在Windows机器上遇到了同样的问题。

实际上,我为另一个用户遇到了相同的错误,但问题是我在我的机器上安装了Postgres数据库,而对于我正在处理的这个特定项目,我正在尝试在docker上使用Postgres镜像,所以当我想要运行该项目时,我会遇到这个错误。 最后,我发现问题是Postgres服务正在运行,因此首先我必须在services.msc上终止它,然后再运行该项目,以便它使用Postgres镜像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接