1

我现在正在学习 Django,并且正在一步一步地学习Django 书。

当我继续第 5 章将我的 Django 项目连接到我的数据库时,我无法连接它。我得到错误:

FATAL:  password authentication failed for user "postgres"

这是代码:

settings.py配置:

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': 'postgis',                      # Or path to database file if using sqlite3.
    'USER': 'postgres',                      # Not used with sqlite3.
    'PASSWORD': 'XXXXXXX',                  # Not used with sqlite3.
    'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
    'PORT': '8904',                      # Set to empty string for default. Not used with sqlite3.
}
}

但是当我使用这些代码在 Python shell 中测试连接和设置时:

from django.db import connection
cursor=connection.cursor()

外壳回复错误:

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "E:\Python27\lib\site-packages\django-1.4.1-    py2.7.egg\django\db\backends\__init__.py", line 306, in cursor
cursor = self.make_debug_cursor(self._cursor())
File "E:\Python27\lib\site-packages\django-1.4.1-py2.7.egg\django\db\backends\
postgresql_psycopg2\base.py", line 177, in _cursor
self.connection = Database.connect(**conn_params)
File "E:\Python27\lib\site-packages\psycopg2\__init__.py", line 179, in connect
connection_factory=connection_factory, async=async)
OperationalError: FATAL:  password authentication failed for user "postgres"

然后我重新安装了 PostgreSQL 和 pycopg2 包。我启动 pgAdminIII 运行服务器并连接到数据库,然后我在 python shell 中运行相同的代码,但问题仍然存在。

需要帮忙!

4

2 回答 2

5

猜测是您使用了错误的密码,或者您的密码pg_hba.conf配置不正确。

您可以使用psql所需的凭据进行连接吗?尝试:

psql -U postgres -W -p 8904 postgis

如果没有,请检查pg_hba.conf用户postgres正在使用identmd5安全性。如果要使用密码连接,则必须是md5. 如果您更改设置,请使用pg_ctl reload或仅重新启动 PostgreSQL 以使更改生效。

您可以pg_hba.conf通过连接到您的数据库psql并运行SHOW hba_file;. 例如:

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

请注意,无论如何,您都不应该使用 PostgreSQL 超级用户进行应用程序连接。创建一个新用户并让 Django 在新数据库上使用该用户。例如,要创建一个名为的用户和一个由该用户拥有的名为django的数据库:django_dbdjango

sudo -u postgres createuser -SDR -P django
sudo -u postgres createdb -O django_db django;

使-SDR默认值显式,即django用户不应该是超级用户并且不应该拥有CREATEDBCREATEUSER权限。

于 2012-08-20T02:17:41.887 回答
0

使用 PostgreSQL 14+ 有一种新的方法来获取fe_sendauth: error sending password authentication错误。

PostgreSQL 14 发行说明中所述,客户端和服务器现在都使用 OpenSSL EVP API,它强制执行 FIPS 模式。如果您的密码使用md5,如果您的 FIPS 配置不允许,您将无法使用 PostgreSQL 14 登录md5

您可以使用 来检查您的默认password_encryption设置SHOW password_encryption;,并使用以下命令手动更新单个用户:

SET password_encryption  = 'scram-sha-256'; 
ALTER USER "user" with password 'password';

要永久更改新用户密码的默认password_encryption设置,请更新postgresql.conf

password_encryption = scram-sha-256

来自 PostgreSQL 14 发行说明:

  • 更改 SHA1、SHA2 和 MD5 哈希计算以使用 OpenSSL EVP API (Michael Paquier)

    这是更现代的并且支持 FIPS 模式。

  • 将 password_encryption 服务器参数的默认值更改为scram-sha-256(Peter Eisentraut)

    以前是md5. 除非更改此服务器设置或以 MD5 格式指定密码,否则所有新密码都将存储为 SHA256。md5此外,不再接受以前是同义词的遗留(和未记录的)类似布尔值的值。

于 2022-03-01T17:18:00.813 回答