psycopg2.OperationalError: FATAL: password authentication failed for user "<my UNIX user>" psycopg2.OperationalError:用户"<我的UNIX用户>"的密码验证失败。

15

我是一个相对较新的网络开发者。

首先,我在我的VPS(Ubuntu 16.04)上部署了一个静态网站,没有问题,然后我尝试添加一个博客应用程序。

使用PostgreSQL在本地可以正常工作,但我无法使其在我的服务器上运行。 似乎它试图使用我的Unix用户连接到Postgres。

为什么我的服务器会这样做呢?

我确实通过postgres用户创建了数据库和所有者,并匹配了settings.py中的登录信息,我希望psycopg2尝试使用这些登录信息连接到数据库:

Settings.py + python-decouple:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': config ('NAME'),
        'USER': config ('USER'),
        'PASSWORD': config ('PASSWORD'),
        'HOST': 'localhost',
        'PORT': '',
    }
}
每次尝试运行./manage.py migrate时,我都会收到这个错误信息:

'myportfolio'是我的Unix用户名,数据库用户名不同:



Traceback (most recent call last):
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 194, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/postgresql/base.py", line 168, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/home/myportfolio/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  password authentication failed for user "myportfolio"
FATAL:  password authentication failed for user "myportfolio"


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "./manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/home/myportfolio/lib/python3.5/site-packages/django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "/home/myportfolio/lib/python3.5/site-packages/django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/myportfolio/lib/python3.5/site-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/myportfolio/lib/python3.5/site-packages/django/core/management/base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "/home/myportfolio/lib/python3.5/site-packages/django/core/management/commands/migrate.py", line 79, in handle
    executor = MigrationExecutor(connection, self.migration_progress_callback)
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/migrations/executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/migrations/loader.py", line 49, in __init__
    self.build_graph()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/migrations/loader.py", line 206, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/migrations/recorder.py", line 61, in applied_migrations
    if self.has_table():
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/migrations/recorder.py", line 44, in has_table
    return self.Migration._meta.db_table in self.connection.introspection.table_names(self.connection.cursor())
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 255, in cursor
    return self._cursor()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 232, in _cursor
    self.ensure_connection()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/utils.py", line 89, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 216, in ensure_connection
    self.connect()
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/base/base.py", line 194, in connect
    self.connection = self.get_new_connection(conn_params)
  File "/home/myportfolio/lib/python3.5/site-packages/django/db/backends/postgresql/base.py", line 168, in get_new_connection
    connection = Database.connect(**conn_params)
  File "/home/myportfolio/lib/python3.5/site-packages/psycopg2/__init__.py", line 130, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
django.db.utils.OperationalError: FATAL:  password authentication failed for user "myportfolio"
FATAL:  password authentication failed for user "myportfolio"

我尝试过:

  • 删除我的Django代码,重新安装
  • 删除/清除PostgreSQL并重新安装
  • 修改pg_hba.conf本地信任

曾经我创建了一个名为“myportfolio”的Django超级用户作为我的Unix用户:这可能会有问题吗?


在配置文件中,'USER' 代表的是设置为用户,根据错误提示信息 'myportfolio',你需要创建该用户(如果不存在)。 - Zoran Pandovski
在一个 .env 文件中,我有以下内容: SECRET_KEY= ... NAME=portfolio_db USER=user_portfolio PASSWORD= ... ALLOWED_HOSTS= ... DEBUG=True EMAIL_HOST_PASSWORD= ...它在本地连接良好,且 django 密钥从一开始就有效,因此 python-decouple 的工作正常。你是说我需要创建一个名为“myportfolio”的 postgres 用户,并授予其对数据库的所有权限吗? 我遵循了一个著名的教程,在其中这两个用户名不同,但它似乎可以正常工作。 - Yannick
1
@ZoranPandovski 谢谢,现在它运行得很好。我认为出于安全原因最好创建一个与Unix用户不同的Postgres用户。这真的很有帮助,请发布一个答案,以便我可以验证它。 - Yannick
8个回答

11

根据错误信息,很明显失败是由于你的应用程序尝试连接到postgres,需要重点关注认证部分。

请按照以下步骤首先了解并复现问题。我假设这是一个Linux服务器,并推荐以下步骤。

步骤1:

$ python3

>>>import psycopg2
>>>psycopg2.connect("dbname=postgres user=postgres host=localhost password=oracle port=5432")
>>>connection object at 0x5f03d2c402d8; dsn: 'host=localhost port=5432 dbname=postgres user=postgres password=xxx', closed: 0

你应该会收到这样的消息。这是一个成功消息。

如果我使用错误的密码,则会得到此错误。

>>>psycopg2.connect("dbname=postgres user=postgres host=localhost password=wrongpassword port=5432")
>>>Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.5/dist-packages/psycopg2/__init__.py", line 130, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  password authentication failed for user "postgres"
FATAL:  password authentication failed for user "postgres"

当pg_hba.conf文件中没有任何条目时,我会收到以下错误提示。

>>> psycopg2.connect("dbname=postgres user=postgres host=localhost password=oracle port=5432 ")
>>> Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.5/dist-packages/psycopg2/__init__.py", line 130, in connect
conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  no pg_hba.conf entry for host "::1", user "postgres", database "postgres", SSL on
FATAL:  no pg_hba.conf entry for host "::1", user "postgres", database "postgres", SSL off

那么,问题就出在密码上。请检查您的密码是否包含任何特殊字符或空格。如果您的密码有空格或特殊字符,请使用双引号,就像我下面使用的那样。

>>> psycopg2.connect(dbname="postgres", user="postgres", password="passwords with spaces", host="localhost", port ="5432")
如果以上步骤都没有问题并且您收到了成功的消息,那么很明显问题就出在您的dsn上。打印传递给这些变量的值。
DATABASES = {

'default': {
    'ENGINE': 'django.db.backends.postgresql_psycopg2',
    'NAME': config ('NAME'),
    'USER': config ('USER'),
    'PASSWORD': config ('PASSWORD'),
    'HOST': 'localhost',
    'PORT': '',
}

验证所有值是否被适当地替换。您可能为用户拥有正确的密码,但是DSN未选择正确的密码。查看是否可以打印DSN并验证连接字符串是否完美生成。您将在那里找到解决方法。


谢谢你向我展示如何使用shell进行调试。使用我的Django设置中的密码和用户,我收到了一个成功的消息。<connection object at 0x7feb703043d8; dsn: 'port=5432 user=user_portfolio dbname=portfolio_db password=xxx host=localhost', closed: 0> 那么这对我的配置意味着什么? - Yannick

10

在我的树莓派上,我遇到了这个问题,我想通过发布实际命令来节省其他人的时间。以下是相关命令:

  1. sudo su - postgres
  2. postgres@raspberrypi:~$ psql
  3. postgres=# CREATE DATABASE websitenamehere
  4. postgres=# CREATE USER mywebsiteuser WITH PASSWORD 'Password';
  5. postgres=# GRANT ALL PRIVILEGES ON DATABASE websitenamehere to mywebsiteuser;
  6. postgres=# \q

完成后,您现在已经创建了一个用户。


如果需要的话,您还可以为用户授予到数据库的连接权限,这可以通过 GRANT CONNECT ON DATABASE <database-name> TO <username>; 来完成。 - HelloBlob
2
你在第5步上打错了:GRANT ALL PRIVILEGES ON DATABASE websitenamehere to mywebsiteuser; - mungaih pk
1
@Garo -- 误字在单词PRIVILEDGES(我们需要去掉D)。 - SuaveSouris

3
在配置文件中设置的用户是什么('USER')?根据以下错误:
FATAL:用户“myportfolio”的密码验证失败
用户是myportfolio,因此如果该用户不存在,则需要创建该用户。

1
我有类似的问题。我的问题在于我没有正确设置环境变量,因此它无法连接。确保如果您进入“编辑配置”,然后是“环境变量”,并将您的答案放在该列中。

这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - Beso

0

如果您的密码中包含一些Postgres无法处理的特殊字符(除非进行一些特殊编码),则可能会出现此问题。


-1

对我来说,我的端口设置错误了。还有一些多余的字符。


-1

这个对我解决了问题:

from sqlalchemy import create_engine

connection_string_orig = "postgres://user_with_%34_in_the_string:pw@host:port/db"

**connection_string = connection_string_orig.replace("%", "%25")**

engine = create_engine(connection_string)

print(engine.url) # should be identical to connection_string_orig

engine.connect()

from: https://dev59.com/3FcP5IYBdhLWcg3w5d_Q#64894203/


2
这个链接看起来是一个低质量的刮板网站,它会复制 Stack Overflow 上的内容并且格式很差。原始链接是 https://dev59.com/3FcP5IYBdhLWcg3w5d_Q - DavidW
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

-1
尝试像这样做:

DATABASES = {
   'default': {
   'ENGINE': 'django.db.backends.sqlite3',
   'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接