指定"-h localhost"时无法登录PostgreSQL

Jum*_*awa 2 postgresql postgresql-9.2

我使用Ubuntu 14.10并从PostgreSQL官方apt存储库安装了PostgreSQL 9.2.(apt.postgresql.org)

当我切换用户postgres并尝试以下命令时,我可以成功登录.

$ psql -U postgres dbname -W
Password for user postgres: (Enter Password)
psql (9.2.9)
Type "help" for help.

dbname=# 
Run Code Online (Sandbox Code Playgroud)

但是,当我指定主机值时,我无法使用以下错误登录.

$ psql -h localhost -U postgres notel -W
Password for user postgres: 
psql: FATAL:  password authentication failed for user "postgres"
FATAL:  password authentication failed for user "postgres"
Run Code Online (Sandbox Code Playgroud)

我正在尝试从Sequelize.js连接,一个用于node.js的ORM,但我遇到了几乎相同的错误消息:

Possibly unhandled Error: error: password authentication failed for user "postgres"
Run Code Online (Sandbox Code Playgroud)

有谁知道我怎么能解决这个问题?

编辑

我的pg_hba.conf如下:

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
Run Code Online (Sandbox Code Playgroud)

我提到了关于pg_hba.conf的文档,但我不知道出了什么问题......

Tim*_*san 6

这很可能与客户端身份验证文件有关:pg_hba.conf.它包含每个主机/套接字/用户/密码/数据库组合的条目.

当您将主机更改为时localhost,您具有与直接通过Unix套接字连接时不同的访问路径.您将通过TCP/IP修补自己,而不是"直接".如果您打开pg_hba.conf文件,最后会发现一堆规则.这些规则定义允许哪些组合访问数据库.

在你的情况下,寻找以...开头的行host,这意味着通过TCP/IP(因此localhost)进行访问,而不是localUnix套接字.

可能有一条线藏在那里阻止host连接访问,或者不通过您认为正确的凭证(peer/ md5陷阱,如下所示).

当您在pg_hba.conf文件中显示时,您的local条目包含peer身份验证和host带有md5身份验证的条目.如果你不知道这两种认证机制之间的区别,那么这就是你目前的罪魁祸首,并且会引起一些严重的头撞(不是金属类型;反墙式).

常见的陷阱

为了避免可能出现的混淆,之间的差异peer,并md5为常见的陷阱地面.它们都使用一个名为postgres(当使用时-U postgres)的Unix用户,但前者实际上是在安装PostgreSQL系统时database创建的用户,后者是在PostgreSQL簿记表中创建的用户.

永远记住,如果您的设置是peer,请使用Unix用户的凭据,如果它是md5使用database用户的凭据.

如果没有为database用户设置密码postgres,请确保先设置密码.也不允许使用空密码.

额外的笔记

始终尝试使您的规则具体,避免all为数据库和用户提供太多条目,因为这可能会使您的安装大开.

将选择适合您的访问组合的第一行,并忽略任何后续行.确保没有更高的行覆盖您的规则.

请记住在更改此文件后重新启动PostgreSQL守护程序,否则将无法获取更改.