3

テストサーバーをセットアップし、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 ) ) 

ご覧のとおり、localhost を使用しています。localhost をローカルの 192 IP に置き換えると機能するため、ユーザー名とパスワードを含めて dsn が正しいことはわかっています。これは 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をtrustに変更することでこれを解決するように見えましたが、私の場合は役に立ちませんでした。

おそらく追加する必要があるのは簡単なことですが、現時点では検索は役に立たないようです. 誰でもこれを修正する方法を教えてもらえますか。

*-----編集----- *

問題を修正するための 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
4

1 に答える 1

3

http://www.postgresql.org/docs/9.1/static/auth-methods.htmlを参照してください:

ident 認証方法は、クライアントのオペレーティング システムのユーザー名を ident サーバーから取得し、それを許可されたデータベース ユーザー名として使用することによって機能します (オプションのユーザー名マッピングを使用)。

ident認証方法は、Web サーバーからの接続にはあまり適していません。これは、Web プロセスがアカウント (通常はデータベース アカウントと関係のないもの) で実行されるためですwww-data(このrockprofile場合)。

パスワードによる認証が必要なので、これをmd5inに置き換えてpg_hba.confPostgreSQL をリロードまたは再起動します。

また、パスワードはトレースに明確に表示されるため、変更することもできます。これにより、コード内での置き換え作業が不要になります。

于 2013-07-18T13:36:58.837 に答える