问题:在本地主机上使用 pdo 连接到 postgresql 时出现问题 (08006)

我已经设置了一个测试服务器并安装了 PHP 5.4(带有 Nginx 的 zend 服务器)和 postgresql 9.1。

我正在尝试使用以下代码连接到 postgresql 数据库:

define('DB_TYPE', 'pgsql');
define('DB_HOST', 'localhost');
define('DB_PORT', 5432);
define('DB_NAME', 'rockprofile');
define('DB_USERNAME', 'rockprofile');
define('DB_PASSWORD', 'PASSWORD');

$dsn = DB_TYPE . ':dbname=' . DB_NAME . ';host=' . DB_HOST . ';port=' . DB_PORT;

try {
   $db = new PDO($dsn, DB_USERNAME, DB_PASSWORD);
} catch (PDOException $e) {
   echo $e->getMessage();
   print_r($e->getTrace());
}

但是,这会产生以下内容:

SQLSTATE[08006] [7] FATAL: Ident authentication failed for user "rockprofile"

Array (
   [0] => Array (
       [file] => /usr/share/nginx/inc/config.php
       [line] => 24
       [function] => __construct
       [class] => PDO 
       [type] => -> [args] => Array (
            [0] => pgsql:dbname=rockprofile;host=localhost;port=5432
            [1] => rockprofile
            [2] => PASSWORD ) )
   [1] => Array ( [file] => /usr/share/nginx/bands/index.php
       [line] => 2
       [args] => Array (
            [0] => /usr/share/nginx/inc/config.php )
            [function] => include ) ) 

如您所见,我正在使用本地主机。我知道 dsn 是正确的,包括用户名和密码,因为如果我用本地 192 IP 替换 localhost 就可以了。我怀疑这是postgresql的配置问题,以下是当前内容:

local   all             all                                    peer
host    all             all            127.0.0.1/32            ident
host    all             all            ::1/128                 ident
host    all             all             192.168.1.0/24          md5

在搜索某人似乎通过将 ident 更改为信任上面的配置来解决这个问题,但这对我来说没有帮助。

这可能是我需要添加的简单内容,但目前搜索似乎没有结果。谁能告诉我如何纠正这个问题。

* - - -编辑 - - -*

根据 Daniel Vérité 修复问题的回应,ident 需要更改为 MD5。我个人不得不为 IPv4 和 IPv6 条目更改此设置。

local   all             all                                    peer
host    all             all            127.0.0.1/32            md5
host    all             all            ::1/128                 md5
host    all             all             192.168.1.0/24          md5

解答

见http://www.postgresql.org/docs/9.1/static/auth-methods.html:

ident 身份验证方法通过从 ident 服务器获取客户端的操作系统用户名并将其用作允许的数据库用户名(带有可选的用户名映射)来工作

ident身份验证方法并不真正适合来自 Web 服务器的连接,因为 Web 进程在一个帐户下运行,通常是www-data或一些与数据库帐户没有关系的帐户(在您的情况下为rockprofile)。

由于您希望通过密码进行身份验证,因此将其替换为pg_hba.conf中的md5并重新加载或重新启动 PostgreSQL。

您也可以更改密码,因为它在跟踪中清晰显示,从而否定了您在代码中的替换工作。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容