该报错本质是postgresql服务端密码认证失败,需依次排查:①确认postgres用户密码是否存在且正确;②检查pg_hba.conf中是否为127.0.0.1配置了md5/scram-sha-256认证;③确保ci4配置hostname为127.0.0.1而非localhost以触发tcp连接;④核对php驱动兼容性及日志中的具体失败原因。

这个问题本质不是 CodeIgniter4 的问题,而是 PostgreSQL 服务端拒绝了你的连接凭据。报错 FATAL: password authentication failed for user "postgres" 意味着认证流程走到了密码校验阶段,但校验失败——要么密码不对,要么根本没走密码校验这步(配置拦住了)。下面分几个关键方向排查和解决:
确认 PostgreSQL 用户密码是否真实存在且正确
CodeIgniter4 只是把配置里的用户名、密码传给 PostgreSQL 驱动(通常是 pdo_pgsql),它不参与密码验证逻辑。所以先脱离框架验证基础凭据:
- 在终端执行:
psql -U postgres -d postgres(不加-h走本地 socket)或psql -U postgres -h 127.0.0.1 -d postgres(走 TCP) - 如果连命令行都输错密码,说明 CI4 配置里的密码本身就是错的——注意大小写、空格、特殊字符是否被 Shell 或 .env 文件意外截断或转义
- 检查密码是否真的设置了:用超级用户(如系统用户
postgres)运行sudo -u postgres psql -c "SELECT rolname, rolpassword IS NOT NULL AS has_password FROM pg_authid WHERE rolname = 'postgres';"
返回has_password = f表示该用户没设密码,需执行:ALTER USER postgres WITH PASSWORD 'your_new_password';
检查 pg_hba.conf 是否允许密码认证
这是最常被忽略的一环。CI4 默认通过 TCP 连接(host 类型),但很多 PostgreSQL 安装默认对本地连接(local)用 peer,对 127.0.0.1 用 md5 或 scram-sha-256。你需要确认匹配规则:
- 找到配置文件:
sudo -u postgres psql -c "SHOW hba_file;" - 编辑该文件,查找类似这行:
host all all 127.0.0.1/32 md5
确保它存在、未被注释、METHOD 是md5或scram-sha-256(新版推荐后者) - 如果只有
local行(Unix socket),而 CI4 没配host,就会 fallback 到 peer 认证——它不认密码,只认系统用户名,必然失败 - 改完后必须重载:
sudo -u postgres pg_ctl reload -D /path/to/data或 SQL 中执行SELECT pg_reload_conf();
核对 CodeIgniter4 数据库配置是否匹配认证方式
CI4 的 app/Config/Database.php 或 .env 中,PostgreSQL 配置要明确指定连接协议和参数:
- 确保
$db['default']['hostname']是127.0.0.1(触发host规则),而不是localhost(某些系统会走 Unix socket,触发local规则) - 确认
port是5432(除非你改过),且 PostgreSQL 正在监听该端口(sudo netstat -tulpn | grep :5432) - 如果 PostgreSQL 启用了
scram-sha-256(9.6+ 默认),而 PHP 的pdo_pgsql版本太老(如 PHP 7.3 或更早),可能不支持——可临时在pg_hba.conf中为开发环境改用md5测试 - 避免在
.env中直接写密码含特殊字符(如@、/),建议用单引号包裹或 URL 编码
查看 PostgreSQL 日志定位具体失败原因
日志里会写明哪条 pg_hba.conf 规则命中、用了什么认证方式、是否因密码为空被拒等细节:
- 查日志路径:
sudo -u postgres psql -c "SHOW log_directory;",通常在pg_log/下 - 找最近的
postgresql-*.log,搜索authentication failed或你的用户名 - 典型提示如:
connection matched pg_hba.conf line 85: "host all all 127.0.0.1/32 md5"→ 说明规则生效了;password authentication failed→ 密码错;peer authentication failed→ 走错了认证方式











