PostgreSQL 15.3为何采用SSPI认证而非密码认证?问题排查
问题分析与解决
核心原因
PostgreSQL的认证规则由pg_hba.conf文件控制,而非postgresql.conf里的全局参数。你遇到的问题是:Windows环境下PostgreSQL 15默认对localhost(含IPv4的127.0.0.1和IPv6的::1)连接配置了SSPI认证(依赖Windows系统用户账号),但你创建的数据库用户foo并非Windows系统用户,导致SSPI认证失败,且服务端优先使用该规则而非密码认证。
解决步骤
1. 找到并打开pg_hba.conf文件
文件路径通常为:
c:\Program Files\PostgreSQL\15\data\pg_hba.conf
2. 修改认证规则
找到文件中针对本地连接的条目,类似如下内容:
# IPv6 local connections: host all all ::1/128 sspi # IPv4 local connections: host all all 127.0.0.1/32 sspi
将其中的sspi替换为scram-sha-256(PostgreSQL 15默认密码加密方式),修改后:
# IPv6 local connections: host all all ::1/128 scram-sha-256 # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256
如果习惯使用md5认证,需先在postgresql.conf中取消注释并设置password_encryption = md5,再重新设置用户密码,最后将上述条目改为md5。
3. 重启PostgreSQL服务
打开Windows服务管理器,找到postgresql-x64-15服务,右键选择重启。
4. 重新尝试连接
执行你的连接命令:
c:\Program Files\PostgreSQL\15\bin>set PGPASSWORD=foo c:\Program Files\PostgreSQL\15\bin>psql -h localhost -p 5432 -U foo -d foo
补充说明
pg_hba.conf的规则按顺序匹配,确保修改的条目在其他可能匹配localhost的规则之前生效。- 若不想修改全局规则,可针对
foo用户或foo数据库单独设置认证方式:host foo foo ::1/128 scram-sha-256 host foo foo 127.0.0.1/32 scram-sha-256
内容的提问来源于stack exchange,提问作者Tomas Kubes
相关产品推荐
相关产品推荐

