使用psycopg2连接到数据库而不使用密码

Pab*_*blo 44 python django postgresql psycopg2

我在localhost上有一个postgres数据库,我可以在没有密码的情况下访问

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

mwt=# SELECT * from vatid;
  id   | requester_vatid |...
  -----+-----------------|...   
  1719 | IT00766780266   |...
Run Code Online (Sandbox Code Playgroud)

我想从django访问该数据库.所以我投入了DATABASES

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
        'USER': 'shaoran',
        'HOST': 'localhost'
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我不需要密码来访问我的测试数据库,因此我没有PASSWORD在设置中提供任何值.

$ ./manage.py shell
>>> from polls.models import Vatid
>>> Vatid.objects.all()
  connection_factory=connection_factory, async=async)
  OperationalError: fe_sendauth: no password supplied
Run Code Online (Sandbox Code Playgroud)

我尝试使用,PASSWORD: ''但我收到相同的错误消息.我尝试使用,PASSWORD: None但这也没有帮助.

我一直在搜索关于这个的django文档,但我找不到任何有用的东西.可以配置django.db.backends.postgresql_psycopg2为接受空密码?

joe*_*ick 59

令人惊讶的是,答案是根本不指定主机.如果你这样做,

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mwt',
    }
}
Run Code Online (Sandbox Code Playgroud)

然后psycopg2将以与Unix套接字相同的方式连接psql.当您指定a时HOST,psycopg2将连接TCP/IP,这需要密码.


b_d*_*dev 26

为避免在Django中使用密码,请settings.py更改md5trust以下行pg_hba.conf:

host    all             all             127.0.0.1/32            trust
Run Code Online (Sandbox Code Playgroud)

有关postgres安全配置的详细信息,请阅读本文档.

要找到此文件:

sudo -u postgres psql -c 'SHOW hba_file;'
Run Code Online (Sandbox Code Playgroud)


okm*_*okm 12

检查您的用户是否pg_hba.conf允许连接,然后提供Django设置的密码或信任该用户localhostshaoranshaoranpg_hba.conf

您可以连接的事实psql是因为psql -d mwt使用了一些默认连接值,这些值被设置为受信任的pg_hba.conf.例如,在我的机器上,默认主机local socket代替localhost


joj*_*ojo 6

作为面临相同问题的人,只有结合了此处给出的答案和google-ing试验的其他发现之后,才找到解决方案,所以我决定整理一个完整的答案

首先要注意的是

放入'HOST'或忽略它settings.py都是可行的选择。但是,是否放置将'HOST'影响必须设置postgresql配置的方式。

'HOST'joerick的回答所述,省略会导致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陷阱):

具有匹配的连接类型,客户端地址,请求的数据库和用户名的第一条记录用于执行身份验证。没有“失败”或“备份”:如果选择了一条记录并且验证失败,则不会考虑后续记录。如果没有记录匹配,则拒绝访问。

带回家的消息:

确保在更广泛的规则之前有任何特定的规则。


既然我们都知道了,这里是如何不用密码访问一次,一次使用'HOST'(so over localhost),一次不使用(so over Unix socket)


连接结束 localhost

'HOST': 'localhost'在您的数据库配置中指定settings.py

# ...
'HOST': 'localhost',
# ...
Run Code Online (Sandbox Code Playgroud)

'PASSWORD' 不需要,可以省略。

您需要在postgresql身份验证配置(/etc/postgresql/x.x/main/pg_hba.conf)中设置的规则适用于TYPE host

注意规则的顺序。因此,如果您有一个用户“ my_user”,无需密码即可访问数据库“ my_database”,则正确的配置应如下所示:

# 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
# ...
Run Code Online (Sandbox Code Playgroud)

颠倒顺序将导致no password supplied错误。


通过Unix域套接字连接

请勿将'HOST'按键放在您的设置中。 'PASSWORD'也不需要。

在postgresql身份验证配置中,使用TYPE规则管理通过Unix域套接字的访问local

如果“ my_user”应该被信任(不需要密码)对数据库“ my_database”的访问,则需要这样的一行:

local my_database my_user trust
Run Code Online (Sandbox Code Playgroud)

至于在哪里,就把这行,这里的规则是,你需要把它放在任何以前更广泛的方面规则DATABASEUSER。为了安全起见,我建议把它在开始/etc/postgresql/x.x/main/pg_hba.conf。如果您的pg_hba.conf文件如下所示:

# RIGHT WAY...
local my_database my_user trust
# ...
local all all peer
# ...
Run Code Online (Sandbox Code Playgroud)

您可以不用密码了。但是,如果看起来像这样:

# WRONG WAY! ...
local all all peer
# ...
local my_database my_user trust
# ...
Run Code Online (Sandbox Code Playgroud)

您需要提供密码。


最后说明:

修改后,请不要忘记重新启动postgresql服务/etc/postgresql/x.x/pg_hba.conf

sudo service postgresql restart
Run Code Online (Sandbox Code Playgroud)

 

         希望这会有所帮助。编码愉快!