web-dev-qa-db-ja.com

Django PostgreSQLへの接続:「ピア認証に失敗しました」

OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

これは、Django adminサイトにアクセスしようとすると表示されるエラーです。MySQLデータベースは問題なく使用していました。PostgreSQLを初めて使用しましたが、ホストI最終的にこのプロジェクトに使用する計画にはMySQLがありません。

そのため、PostgreSQLのインストールプロセスを実行し、syncdbを実行し、すべてを設定できると考えました。

問題は、データベースに接続するようにアプリを取得できないように見えることです。ダウンロードしたコマンドラインまたはデスクトップアプリからPostgreSQLにログインできます。スクリプトではありません。

また、manage.py Shellデータベースに正常にアクセスします。

何かご意見は?

114
The Brewmaster

例外を覗いてみると、接続設定に関係していることがわかりました。 settings.pyに戻り、ホストのセットアップがないことがわかりました。 localhostと出来上がりを追加します。

私のsettings.pyにはMySQLデータベース用のホストがありませんでしたが、PostgreSQLが動作するように追加する必要がありました。

私の場合、localhost設定にHostを追加しましたが、うまくいきました。

これは私のsettings.pyDATABASESセクションです。

DATABASES = { 
    'default': { 
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': '<MYDATABASE>', 
        'USER': '<MYUSER>', 
        'PASSWORD': '<MYPASSWORD>', 
        'Host': 'localhost', # the missing piece of the puzzle 
        'PORT': '', # optional, I don't need this since I'm using the standard port
    } 
}
210
The Brewmaster

これはおそらく、接続しようとしているユーザー以外のユーザーの下でスクリプトが実行されているためです(myuserhere)。この場合、ピア認証は失敗します。ピア認証を使用していないため、Host: "localhost"を使用したソリューションが機能します。ただし、Unixソケットを使用する代わりにTCP接続を使用します。 Django docs :を使用するため、Host: ""よりも低速です。

PostgreSQLを使用している場合、デフォルトで(空のホスト)、データベースへの接続はUNIXドメインソケット(pg_hba.confの「ローカル」行)を介して行われます。 TCPソケットで接続する場合、Hostを 'localhost'または '127.0.0.1'(pg_hba.confの 'Host'行)に設定します。Windowsでは、常にHostを定義する必要があります。 UNIXドメインソケットは利用できないためです。

ソケットを使い続ける場合は、pg_hba.confの正しい設定が必要です。最も簡単なのは:

local   all         all                               trust

構成内の他のすべてのlocal行をコメントアウトします。この変更を有効にするには、postgresの再読み込みが必要であることに注意してください。

しかし、マルチユーザーの実稼働マシンが問題になっている場合は、md5(さまざまな認証方法の説明については here を参照)のようなより安全なものを使用することができます。

20
clime

完全に信頼するよりも、md5に設定するだけです。

# "local" is for Unix domain socket connections only
local   all         all                           md5
14
Houman

/etc/postgres/9.1/main/pg_hba.confの下部を編集して修正しました(md5を信頼するように変更します。これは、データベースパスワードがないことを意味します。

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
Host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
Host    all         all         ::1/128               trust
6
vish

私はちょうど同じ問題に出くわしましたが、climeが言ったように、まだpeerメソッドを使用して、UNIXソケットを使用したかったのです。 pg_hba.conf内のsystem-usernameをpostgres-usernameにマッピングしました。これはpeerメソッドで動作します。

内部pg_hba.confを追加しました:

local all all peer map=map-name

内部pg_ident.confを追加しました:

map-name mysystem-username mypostgres-username
4
seeN