web-dev-qa-db-ja.com

パスワードなしでpsycopg2を使用してDBに接続する

パスワードなしでアクセスできるlocalhostにpostgresデータベースがあります

$ psql -d mwt
psql (8.4.12)
Type "help" for help.

mwt=# SELECT * from vatid;
  id   | requester_vatid |...
  -----+-----------------|...   
  1719 | IT00766780266   |...

Djangoからそのデータベースにアクセスしたい。そこでDATABASESを入れました

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
        'USER': 'shaoran',
        'Host': 'localhost'
    }
}

テストデータベースにアクセスするためにパスワードは必要ないため、設定にPASSWORD値を指定しませんでした。

$ ./manage.py Shell
>>> from polls.models import Vatid
>>> Vatid.objects.all()
  connection_factory=connection_factory, async=async)
  OperationalError: fe_sendauth: no password supplied

PASSWORD: ''を使用しようとしましたが、同じエラーメッセージが表示されます。 PASSWORD: Noneを使用しようとしましたが、それも助けにはなりませんでした。

これについてDjangoのドキュメントを検索しましたが、有用なものが見つかりません。空のパスワードを受け入れるようにDjango.db.backends.postgresql_psycopg2を構成することは可能ですか?

43
Pablo

pg_hba.confを確認して、ユーザーlocalhostからのshaoranからの接続を許可してから、Django settingsでshaoranのパスワードを入力するか、pg_hba.confでユーザーを信頼する

psqlを介して接続できるという事実は、psql -d mwtpg_hba.confで信頼済みとして設定されているデフォルトの接続値を使用するためです。たとえば、私のマシンでは、デフォルトのホストはlocalhostではなくlocal socketです

12
okm

驚くべきことに、答えはホストをまったく指定しないことです。これを行うと、

DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
    }
}

Psycopg2は、psqlと同じ方法でUnixソケットを使用して接続します。 Hostを指定すると、psycopg2はパスワードが必要なTCP/IPに接続します。

59
joerick

Django settings.pymd5のこの行でpg_hba.conftrustに変更する]でパスワードを使用しないようにするには:

Host    all             all             127.0.0.1/32            trust

Postgresセキュリティ構成の詳細については、 このドキュメント を参照してください。

このファイルを見つけるには:

Sudo -u postgres psql -c 'SHOW hba_file;'
26
b_dev

同じ問題に直面し、ここからのさまざまな部分を組み合わせた後に解決策を見つける誰かがグーグルのトライアルからの答えと他の発見を提示したので、私は、できれば完全な答えをまとめることにしました

最初に注意すること

_'Host'_を入れるか、_settings.py_で省略することは、実行可能なオプションです。ただし、_'Host'_を指定するかどうかは、postgresql設定の設定方法に影響します。

joerick's answer のように_'Host'_を省略すると、psycopg2がUnixドメインソケットで接続しようとします。一方、構成に_'Host'_キーが含まれている場合、psycopg2はIPv4/6 localhostを介して接続を試みます。 postgresql認証設定(_/etc/postgresql/x.x/main/pg_hba.conf_)は接続方法のいずれかに固有であるため、これは大きな違いをもたらします。

持ち帰りメッセージ:

postgresql認証設定でも設定した接続タイプを選択してください。

注:

postgresql認証設定(_/etc/postgresql/x.x/main/pg_hba.conf_)は、エントリの順序を考慮します。

ドキュメント は実際にこれについて非常に明確です(まだ_local all all peer_トラップ)に落ちました:

接続タイプ、クライアントアドレス、要求されたデータベース、およびユーザー名が一致するfirstレコードは、認証の実行に使用されます。 「フォールスルー」または「バックアップ」はありません。1つのレコードが選択され、認証が失敗した場合、後続のレコードは考慮されません。一致するレコードがない場合、アクセスは拒否されます。

持ち帰りメッセージ:

特定のルールがより広いルールの前に来るようにしてください。


これですべてがわかったので、ここでパスワードなしでアクセスする方法を示します。1回は_'Host'_で(そうでlocalhost以上)、もう1回はそうでなく(つまりUnixソケットで) )


localhostを介した接続

_'Host': 'localhost'_のデータベース構成で_settings.py_を指定します。

_# ...
'Host': 'localhost',
# ...
_

_'PASSWORD'_は不要であり、省略できます。

Postgresql認証設定(_/etc/postgresql/x.x/main/pg_hba.conf_)で設定する必要があるルールは、TYPE Host用です。

ルールの順序に注意してください。したがって、パスワードなしでデータベース「my_database」にアクセスできるはずのユーザー「my_user」がある場合、正しい構成は次のようになります。

_# RIGHT WAY...
Host my_database my_user 127.0.0.1/32 trust
Host my_database my_user ::1/128 trust
# ...
Host all all 127.0.0.1/32 peer
# ...
_

順序を逆にすると、_no password supplied_エラーが発生します。


Unixドメインソケットを介した接続

設定に_'Host'_キーを入れないでください。 _'PASSWORD'_も必要ありません。

Postgresql認証構成では、Unixドメインソケットを介したアクセスはTYPE localのルールで管理されます。

「my_user」がデータベース「my_database」への信頼できるアクセス(パスワードは不要)を取得する場合、次のような行が必要です。

_local my_database my_user trust
_

この行を配置する場所に関して、ここでのルールは、DATABASEおよびUSERに関して、broaderルールの前に配置する必要があるということです。安全のため、_/etc/postgresql/x.x/main/pg_hba.conf_のbeginningに置くことをお勧めします。 _pg_hba.conf_ファイルが次のようになっている場合:

_# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...
_

パスワードなしで行っても問題ありません。ただし、次のような場合:

_# WRONG WAY! ...
local all all peer
# ...
local my_database my_user trust
# ...
_

パスワードを入力する必要があります。


最後のメモ:

_/etc/postgresql/x.x/pg_hba.conf_の変更後にpostgresqlサービスを再起動することを忘れないでください:

_Sudo service postgresql restart
_

これが役に立ったと思います。ハッピーコーディング!

5
jojo

私は「ローカルオールオールピア」のみで生活しています。接続文字列には、ホスト、ユーザー、およびパスワードを含めないでください:postgres:/// mydbname。

Environモジュールなしでは、次のようになります。

DATABASES = {
    'default': {'NAME': 'mydatabase', 'USER': '', 'PASSWORD': '', 'Host': '', 'PORT': '', 'ENGINE': 'Django.db.backends.postgresql_psycopg2'}
}

Environモジュールの場合:

import environ
env = environ.Env()
DATABASES = {
    'default': env.db('DATABASE_URL', default='postgres:///mydatabase'),
}

.envファイルにはDATABASE_URL設定が含まれていません。

ユーザー 'postgres'に対してのみmd5を使用しますが、psql/pgadmin3からのみ使用し、Django code。

# /etc/postgresql/version/cluster/pg_hba.conf:
local all postgres md5
local all all peer
1
mirek