Django与PostgreSQL的连接:“对等身份验证失败”


120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

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

因此,我认为我可以完成安装PostgreSQL的过程,运行a syncdb并设置好。

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

另外,我可以使用它manage.py shell来访问数据库。

有什么想法吗?

Answers:


218

我偷看了一个例外,发现它与我的连接设置有关。回到settings.py,看到我没有主机设置。添加localhost并瞧。

我的settings.py没有用于MySQL数据库的主机,但是我需要为PostgreSQL添加一个主机。

就我而言,我添加localhostHOST设置,并且可以正常工作。

这是DATABASES我的部分settings.py

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
    } 
}

5
您可以考虑将解决方案从问题转移到答案(并接受)。这样,问题将仍然是一个问题,并且将提供正确的答案。BTW:干得好!:-)
Piotr Nowicki

3
Rails应用程序也存在相同的问题,并且是相同的解决方案-需要在其中配置主机config/database.yml-也就是说,在该文件中,我需要添加行host: localhost(或者无论postgres服务器在哪里-我的是本地的)
jefflunt 2011年

7
当HOST为空时,Django尝试使用UNIX套接字连接到数据库。另一方面,当主机为“ localhost”时,它通过TCP / IP连接到127.0.0.1。可能是,您pg_hba.conf设置为拒绝普通用户通过UNIX套接字进行连接,但允许它们通过来自本地主机的TCP / IP进行连接。
吉姆·加里森

3
文档(docs.djangoproject.com/en/1.6/ref/settings/#host)位于:“主机[...]空字符串表示本地主机”。这是不正确的,我遇到了同样的问题,并且将其写为“ localhost”。谢谢你的提示。
Marco Sulla 2013年

1
啊哈!我知道我知道密码。夹层产生一个local_settings.py文件,并且# Set to empty string for localhost. Not used with sqlite3.在其中。谎言!
teewuane

23

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

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

如果要继续使用套接字,pg_hba.conf则需要正确的设置。最简单的是:

local   all         all                               trust

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

但是,如果有关于多用户生产机器的问题,则可能需要使用更安全的工具md5(请参阅此处,了解各种身份验证方法)。


14

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

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

5
+1; 但请注意,md5通常(略)优于密码,因为它会发送散列而不是密码。(在本地时,这没什么大不了;但是,如果通过网络进行窃听,这很重要。)
jimbob博士2012年

如果PostgreSQL不添加密码哈希值-并且我不知道它是否包含密码-那么任何足够精通实际窃听您的连接的人都可能会通过彩虹表运行您的哈希并以任何方式破坏您的安全性。
Lyndsy Simon

“ md5”比“ trust”更好,但是最好是使用“ peer”并创建没有登录权限的Linux用户,仅用于本地连接。这样,您必须提供root密码才能从本地访问数据库。
Marco Sulla 2013年

6

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

# 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

5

我只是偶然发现了同样的问题,但是想要像使用clime所说的那样使用unix套接字,但是仍然使用该peer方法。我将system-username与postgres-username映射到pg_hba.conf一起使用该peer方法。

pg_hba.conf我里面添加:

local all all peer map=map-name

pg_ident.conf我里面添加:

map-name mysystem-username mypostgres-username
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.