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

时间:2012-06-25 15:17:49

标签: 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   |...

我想从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配置为接受空密码吗?

5 个答案:

答案 0 :(得分:57)

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

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

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

答案 1 :(得分:25)

为了避免在Django settings.py中使用密码,请在md5的这一行中将trust更改为pg_hba.conf

host    all             all             127.0.0.1/32            trust

要详细了解postgres安全配置,请阅读this doc.

要找到此文件:

sudo -u postgres psql -c 'SHOW hba_file;'

答案 2 :(得分:12)

检查您的pg_hba.conf以允许用户localhostshaoran建立连接,然后在Django设置中提供shaoran的密码或信任pg_hba.conf中的用户}

您可以通过psql进行连接的事实是因为psql -d mwt使用了一些在pg_hba.conf中设置为受信任的默认连接值。例如,在我的计算机上,默认主机为local socket而不是localhost

答案 3 :(得分:4)

由于有人面临同样的问题而且只是在结合目前答案和谷歌试验的其他发现中的各个部分后才找到解决方案,我决定整理一个希望完整的答案

首先要注意的是

'pry's中放置'HOST'或省略它都是可行的选择。 但是,是否放置settings.py会影响您如何设置postgresql配置。

joerick's answer中省略'HOST'导致psycopg2试图通过Unix域套接字连接。另一方面,如果您的配置包含'HOST'密钥,psycopg2将尝试通过IPv4 / 6 'HOST'进行连接。这有很大的不同,因为postgresql身份验证配置(localhost)特定于这两种连接方式。

带回家留言:

  

确保选择您在postgresql身份验证配置中配置的连接类型。

要注意的第二件事:

postgresql身份验证配置(/etc/postgresql/x.x/main/pg_hba.conf)关注条目的顺序。

The docs实际上非常清楚这一点,(但我设法落入了/etc/postgresql/x.x/main/pg_hba.conf陷阱):

  

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

带回家留言:

  

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

现在我们已经了解了所有这些,这里是如何在没有密码的情况下获取访问权限,一次使用local all all peer(所以超过'HOST'),一次没有(因此超过Unix套接字)

localhost

上的连接

localhost的数据库配置中指定'HOST': 'localhost'

settings.py

# ... 'HOST': 'localhost', # ... 不需要,可以省略。

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

注意规则的排序。因此,如果您的用户'my_user'应该能够在没有密码的情况下访问数据库'my_database',那么正确的配置将如下所示:

host

反转排序将导致# 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 # ... 错误。

通过Unix域套接字连接

请勿将no password supplied键放入您的设置中。

在postgresql身份验证配置中,通过TYPE 'HOST'规则管理对Unix域套接字的访问。

如果'my_user'应该被信任(不需要密码)访问数据库'my_database',你需要这样一行:

'PASSWORD'

关于放置此行的位置,此处的规则是您需要在locallocal my_database my_user trust 方面将其放在任何更广泛的规则之前。为安全起见,我建议将其放在DATABASE开头。如果您的USER文件如下所示:

/etc/postgresql/x.x/main/pg_hba.conf
你很高兴没有密码。但是,如果它看起来像这样:

pg_hba.conf

您需要提供密码。

最后的说明:

修改# RIGHT WAY... local my_database my_user trust # ... local all all peer # ... 后,不要忘记重启postgresql服务:

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

希望这很有帮助。快乐的编码!

答案 4 :(得分:1)

我和所有同行一起生活在本地同行。只要。连接字符串应该没有主机,用户和密码: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代码。

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