"local"和"localhost"在pg_hba.conf中的连接类型有什么区别?
"local"和"localhost"在pg_hba.conf中的连接类型有什么区别?
这是我pg_hba.conf
文件的相关部分:
# 类型 数据库 用户 地址 认证方法 # "local"仅适用于Unix域套接字连接 local all all ident # IPv4本地连接: host all all 127.0.0.1/32 ident # IPv6本地连接: host all all ::1/128 ident
pidentd服务正在运行。
当我尝试登录ee1时(我假设默认用户是postgres):
psql ee1
它显示"用户postgres的对等认证失败"。
- 我在哪里为"postgres"配置了
peer
认证?是ident
。 - 当我将
pg_hba.conf
中的以下行更改为:local all all ident
到
local all all md5
它会要求我输入密码,我可以成功登录。为什么更改本地连接类型会影响postgres用户?
在pg_hba.conf文件中,"local"是一种连接类型,而"localhost"是本地环回地址的网络地址,对应的是IPv4地址"127.0.0.1"或者IPv6地址"::1"。
关于pg_hba.conf的说明来自于官方文档:
"local"记录用于匹配使用Unix域套接字的连接尝试。如果没有这种类型的记录,将禁止Unix域套接字连接。
"host"记录用于匹配使用TCP/IP的连接尝试。host记录匹配SSL或非SSL的连接尝试。
需要注意的是:除非服务器以适当的值启动listen_addresses配置参数,否则将无法进行远程TCP/IP连接,因为默认行为仅在本地回环地址localhost上监听TCP/IP连接。
关于postgresql.conf中的listen_addresses配置参数,默认值为localhost,这只允许进行本地TCP/IP的"loopback"连接。
我在指定使用环回地址的host连接类型时设置为md5,并尝试使用"psql ee1"命令,但它从未要求我输入密码。当我指定使用local连接类型时设置为md5时,它开始要求我输入密码。为什么会这样?我如何知道我是使用Unix套接字访问localhost还是使用TCP/IP访问localhost?
如果您在本地连接(例如在同一台机器上使用psql),则pg_hba.conf文件中host连接类型的设置是无效的,而local连接类型的设置是相关的。当您在连接中不提供网络地址(因此在本地连接)时,将自动使用Unix套接字。
在pg_hba.conf文件中,有两种连接类型:local和localhost。这两种连接类型在认证方式上有所不同。
local连接类型使用ident认证方式。这意味着操作系统用户必须与数据库用户匹配。这种认证方式仅支持TCP/IP连接,如果使用Unix套接字连接,则会使用Peer认证方式。
需要注意的是,默认用户不是“postgres”,而是当前登录的用户。
当使用local连接类型时,如果出现“peer authentication failed for user 'postgres'”的错误提示,可能是因为当前登录的用户与数据库用户不匹配。
解决方法:将pg_hba.conf文件中的认证方式改为其他方式,如md5或password。