使用 psycopg2 无密码连接到数据库

Posted

技术标签:

【中文标题】使用 psycopg2 无密码连接到数据库【英文标题】:connect to a DB using psycopg2 without password 【发布时间】:2012-06-26 20:58:11 【问题描述】:

我的本​​地主机上有一个 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接受空密码吗?

【问题讨论】:

您可以通过 localhost 或 Unix 域套接字进行配置。 Here 解释了这两种情况的工作原理。 @jojo 非常感谢您的评论。很久以前,我什至不记得我做了什么来修复它,反正这个项目早就死了。 希望它对其他人有用!与上述项目相反,这种配置的潜​​在缺陷仍然存在,这两个事实都令人遗憾。 @jojo 基于对所有答案和问题的赞成票数,这个问题肯定也帮助了其他人。现在我记得,问题是(正如你在回答中所说)我使用了HOST 参数。 【参考方案1】:

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

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

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

【讨论】:

对我来说仍然失败:django.db.utils.OperationalError: FATAL: Peer authentication failed for user "www-data";必须在 hba.conf before 中添加 local all www-data trust 默认 local all postgres peer 行。 @jcomeau_ictx I added a complete explanation 这是如何通过 Unix 域(如本答案中隐含的建议)以及通过 localhost 建议的 the accepted answer 工作的。 在将 postgres 设置为信任后,我可以使用 PGAdmin 登录,但 Django 仍然无法建立连接并引发 fe_authentication 错误。只有这个解决方案有效!谢谢!【参考方案2】:

为了避免在 Django 中使用密码 settings.pymd5 更改为 trustpg_hba.conf 这一行中:

host    all             all             127.0.0.1/32            trust

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

要找到这个文件:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

我不认为这是 pg_hba.conf 的问题。实际上,这个 mwt 数据库用于 rails 应用程序,我没有在我的 rails 配置中指定任何用户名或任何密码,并且我对 rails 访问我的数据库没有任何问题。我的 Rails 配置文件是:# config/database.yml 开发:适配器:postgresql 数据库:mwt 我对 django 很陌生,我想快速测试多个数据库连接,这就是为什么我尝试使用我已经拥有的数据库在我的系统上。 @Pablo 这里的关键是你指定了host=localhostuser=shaoran,这可能与psqlRails使用的DSN不同 Upps,我没有意识到代码块在注释字段中不起作用。无论如何,我犯了一个巨大的错误,因为我当前的用户@work 是yanez 而不是shaoran(我的用户@home)。我将 USER 更改为“yanez”,但仍然出现相同的错误。我什至从 settings.py 中删除了 USER 条目,以便配置与 rails 之一匹配,但我仍然收到该错误:( @Pablo 我不知道 Rails 是如何处理这个问题的,Django 有 own defaults 感谢您的帮助。除了用户名错误的愚蠢错误之外,这里的问题是 host 条目。我假设没有它 psql、rails 和 psycopg2 通过文件套接字而不是网络套接字访问本地数据库。【参考方案4】:

作为一个面临同样问题的人,并且只有在结合此处提供的答案的各个部分和 google-ing 试验的其他发现后才找到解决方案,我决定整理一个有希望的完整答案

首先要注意

'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) 关心条目的顺序。

The docs其实很清楚这一点,(但我还是掉进了local all all peer的陷阱):

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

带回家留言:

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


现在我们知道了所有这些,这里是如何在没有密码的情况下获得访问权限,一次使用'HOST'(所以超过localhost)和一次没有密码(所以通过 Unix 套接字)


通过localhost 连接

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

# ...
'HOST': 'localhost',
# ...

'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
# ...

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


通过 Unix 域套接字连接

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

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

如果“my_user”应该获得信任(无需密码)访问数据库“my_database”,您需要这样一行:

local my_database my_user trust

关于将这一行放在哪里,这里的规则是您需要将它放在任何更广泛 规则之前,就DATABASEUSER 而言。为了安全起见,我建议将其放在/etc/postgresql/x.x/main/pg_hba.conf开头。如果您的 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】:

我只与“本地所有所有同行”一起生活。连接字符串应该没有主机、用户和密码:postgres:///mydbname。

没有 environ 模块,它看起来是这样的:

DATABASES = 
    'default': 'NAME': 'mydatabase', 'USER': '', 'PASSWORD': '', 'HOST': '', 'PORT': '', 'ENGINE': 'django.db.backends.postgresql_psycopg2'

使用环境模块:

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

【讨论】:

以上是关于使用 psycopg2 无密码连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 SSH 隧道的 PostgreSQL/psycopg2 密码验证

Centos 7 SSH 无密码登录

如何强制 Access 更改无 DSN 的 ODBC 连接的用户名和密码?

无密码远程登录到远程服务器并执行命令并检索详细信息

配置master无密码登陆所有的slave

psycopg2.OperationalError:致命:密码认证