【问题标题】:Django connection to PostgreSQL: "Peer authentication failed"Django 与 PostgreSQL 的连接:“对等身份验证失败”
【发布时间】:2011-12-31 08:12:58
【问题描述】:
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

这是我在尝试访问 Django 管理站点时收到的错误。我一直在使用 MySQL 数据库没有问题。我是 PostgreSQL 新手,但决定切换,因为我最终计划用于该项目的主机没有 MySQL。

因此,我想我可以完成安装 PostgreSQL 的过程,运行 syncdb 并准备就绪。

问题是我似乎无法让我的应用程序连接到数据库。我可以通过我下载的命令行或桌面应用程序登录 PostgreSQL。只是不在剧本中。

另外,我可以使用manage.py shell 访问数据库就好了。

有什么想法吗?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:

    我看了一眼异常,发现它与我的连接设置有关。回到 settings.py,发现我没有设置主机。添加localhost,瞧。

    我的 settings.py 没有 MySQL 数据库的 HOST,但我需要添加一个 PostgreSQL 才能工作。

    在我的例子中,我将localhost 添加到HOST 设置中并且它起作用了。

    这是我的settings.py 中的DATABASES 部分。

    DATABASES = { 
        'default': { 
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': '<MYDATABASE>', 
            'USER': '<MYUSER>', 
            'PASSWORD': '<MYPASSWORD>', 
            'HOST': 'localhost', # the missing piece of the puzzle 
            'PORT': '', # optional, I don't need this since I'm using the standard port
        } 
    }
    

    【讨论】:

    • 您可能会考虑将解决方案从您的问题转移到您的答案(并接受它)。这样,问题将仍然是一个问题,并且它会提供适当的答案。顺便说一句:干得好! :-)
    • 在 Rails 应用程序中遇到了同样的问题,并且是相同的解决方案 - 需要在 config/database.yml 中配置主机 - 也就是说,在该文件中我需要添加行 @ 987654329@(或者你的 postgres 服务器在哪里——我的是本地的)
    • 当 HOST 为空时,Django 尝试使用 UNIX 套接字连接到数据库。另一方面,当 HOST 为“localhost”时,它通过 TCP/IP 连接到 127.0.0.1。很可能,您的pg_hba.conf 设置为拒绝普通用户通过 UNIX 套接字进行连接,但允许他们通过 TCP/IP 从 localhost。
    • 文档 (docs.djangoproject.com/en/1.6/ref/settings/#host) 谎言:“HOST [...] 空字符串表示 localhost”。这不是真的,我有同样的问题,我把它改写为'localhost'。谢谢你的提示。
    • 啊哈!我知道我知道密码。 Mezzanine 生成一个local_settings.py 文件,# Set to empty string for localhost. Not used with sqlite3. 在其中。谎言!!!
    【解决方案2】:

    我通过编辑 /etc/postgres/9.1/main/pg_hba.conf 的底部来解决这个问题(将 md5 更改为信任;注意这意味着不会有数据库密码,这可能不是你想要的)

    # TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
    
    # "local" is for Unix domain socket connections only
    local   all         all                               trust
    # IPv4 local connections:
    host    all         all         127.0.0.1/32          trust
    # IPv6 local connections:
    host    all         all         ::1/128               trust
    

    【讨论】:

      【解决方案3】:

      比完全信任更好的是将其设置为 md5。

      # "local" is for Unix domain socket connections only
      local   all         all                           md5
      

      【讨论】:

      • +1;但请注意 md5 通常(略)比密码好,因为它会发送哈希而不是密码。 (在本地时,这无关紧要;但如果通过网络进行,可能有窃听者,则意义重大。)
      • 如果 PostgreSQL 不加盐密码散列——我不知道它是否加盐——那么任何老练到能够真正窃听你的连接的人都可能会通过彩虹表运行你的散列无论如何都会破坏你的安全。
      • "md5" 比 "trust" 好,但最好是使用 "peer" 并创建一个没有登录权限的 Linux 用户,仅用于本地连接。这样你必须提供你的root密码才能从本地访问数据库。
      【解决方案4】:

      这可能是因为您的脚本在您尝试连接的用户之外的其他用户下运行(此处为 myuser)。在这种情况下,对等身份验证将失败。您使用HOST: "localhost" 的解决方案有效,因为您不再使用对等身份验证。但是,它比HOST: "" 慢,因为您使用 TCP 连接而不是使用 unix 套接字。来自django docs

      如果您使用的是 PostgreSQL,默认情况下(空主机),连接到 数据库是通过 UNIX 域套接字完成的(在 pg_hba.conf)。如果要通过 TCP 套接字连接,请将 HOST 设置为 “localhost”或“127.0.0.1”(pg_hba.conf 中的“host”行)。在 Windows 上, 您应该始终定义 HOST,因为 UNIX 域套接字不是 可用。

      如果您想继续使用套接字,则需要在pg_hba.conf 中进行正确设置。最简单的就是:

      local   all         all                               trust
      

      同时注释掉配置中的所有其他 local 行。请注意,此更改需要重新加载 postgres 才能生效。

      但如果多用户生产机器存在问题,您可能希望使用更安全的方法,例如md5(有关各种身份验证方法的说明,请参阅here)。

      【讨论】:

        【解决方案5】:

        我只是偶然发现了同样的问题,但想使用 clime 所说的 unix 套接字,但仍然使用 peer 方法。我将我的系统用户名映射到 pg_hba.conf 中的 postgres 用户名,该用户名使用 peer 方法。

        pg_hba.conf里面我加了:

        local all all peer map=map-name
        

        pg_ident.conf里面我加了:

        map-name mysystem-username mypostgres-username
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-30
          • 2014-07-15
          • 2014-11-03
          • 2019-12-14
          • 2014-03-17
          • 2013-07-23
          • 2016-03-19
          • 2010-09-12
          相关资源
          最近更新 更多