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


120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

これは、Django管理サイトにアクセスしようとすると表示されるエラーです。私はMySQLデータベースを問題なく使用していました。私はPostgreSQLを使い始めたばかりですが、最終的にこのプロジェクトで使用する予定のホストにMySQLがないため、切り替えることにしました。

したがって、私はPostgreSQLのインストールプロセスを実行し、a syncdbを実行してすべての準備ができると考えました。

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

また、私はmanage.py shellうまくdbにアクセスするために使用できます。

何かご意見は?

回答:


217

例外をのぞいてみたところ、接続設定に関係していることに気づきました。settings.pyに戻ってみると、ホストの設定がないことがわかりました。追加localhostして出来上がり。

私のsettings.pyにはMySQLデータベース用のHOSTがありませんでしたが、PostgreSQLを機能させるためにHOSTSを追加する必要がありました。

私の場合、私localhostHOST設定に追加し、それはうまくいきました。

これがDATABASES私のセクションsettings.pyです。

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
    } 
}

5
ソリューションを質問から回答に移動する(そしてそれを受け入れる)ことを検討する場合があります。このように、質問は質問のままであり、適切に回答が提供されます。ところで:よくできました!:-)
Piotr Nowicki

3
Railsアプリで同じ問題があり、それは同じ解決策でした-ホストを構成する必要がありましたconfig/database.yml-つまり、そのファイルに行を追加する必要がありましたhost: localhost(またはpostgresサーバーがある場所はどこでも-私はローカルでした)
jefflunt 2011

7
HOSTが空白の場合、DjangoはUNIXソケットを使用してデータベースに接続しようとします。一方、HOSTが「localhost」の場合、TCP / IPを介して127.0.0.1に接続します。おそらく、pg_hba.conf通常のユーザーがUNIXソケット経由で接続するのを拒否するように設定されていますが、ローカルホストからTCP / IP経由でそれらを許可しています。
ジムギャリソン2013年

3
ドキュメント(docs.djangoproject.com/en/1.6/ref/settings/#host)は次のとおりです:「HOST [...]空の文字列はlocalhostを意味します」これは真実ではありません、私は同じ問題を抱えていたので、「localhost」と書いて修正しました。先端をありがとう。
Marco Sulla

1
ああ!パスワードを知っていました。メザニンはlocal_settings.pyファイルを作成し、# Set to empty string for localhost. Not used with sqlite3.その中にあります。嘘!!!
teewuane

23

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

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

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

local   all         all                               trust

構成local内の他のすべての行をコメント化している間。この変更を有効にするにはpostgresのリロードが必要であることに注意してください。

ただし、マルチユーザーのプロダクションマシンに問題がある場合は、より安全なものを使用することをお勧めしますmd5(さまざまな認証方法の説明については、こちらを参照してください)。


14

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

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

5
+1; ただし、md5は、パスワードではなくハッシュを送信するため、一般にパスワードよりも(少し)優れています。(ローカルの場合はそれほど問題ではありませんが、ネットワーク上で盗聴の可能性がある場合は重要です。)
dr jimbob

PostgreSQLがパスワードハッシュをソルトしない場合-そしてそれができるかどうかはわかりません-接続を実際に盗聴するのに十分に洗練された人は、おそらくレインボーテーブルを介してハッシュを実行し、セキュリティを破ることになります。
Lyndsy Simon 2012

「md5」は「信頼」よりも優れていますが、「ピア」を使用して、ログイン権限のないLinuxユーザーを作成することをお勧めします。ローカル接続の場合のみです。この方法で、ローカルからデータベースにアクセスするには、ルートパスワードを入力する必要があります。
Marco Sulla

6

/etc/postgres/9.1/main/pg_hba.confの下部を編集してこれを修正しました(md5をtrustに変更します。これは、データベースパスワードがないため、意図したものではない可能性があることを意味します)。

# 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

5

私は同じ問題に出くわしましたが、climeが言ったようにunixソケットを使用したかったのですが、まだpeerメソッドを使用しています。メソッドでpg_hba.conf動作している内のpostgres-usernameでシステムユーザー名をマップしましたpeer

インサイドpg_hba.conf私がコメントを追加しました:

local all all peer map=map-name

インサイドpg_ident.conf私がコメントを追加しました:

map-name mysystem-username mypostgres-username
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.