使用 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.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;'
【讨论】:
【参考方案3】:检查您的pg_hba.conf
以允许用户shaoran
从localhost
连接,然后在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=localhost
和user=shaoran
,这可能与psql
和Rails
使用的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
关于将这一行放在哪里,这里的规则是您需要将它放在任何更广泛 规则之前,就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
# ...
不用密码就可以了。但是,如果它看起来像这样:
# 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 密码验证