2011-11-17 29 views
109
OperationalError at /admin/ 

FATAL: Peer authentication failed for user "myuser" 

這是我在嘗試訪問我的Django管理站點時收到的錯誤。我一直在使用MySQL數據庫沒有問題。我是PostgreSQL的新手,但決定切換,因爲我最終計劃用於此項目的主機沒有MySQL。Django連接到PostgreSQL:「對等驗證失敗」

因此,我想我可以通過安裝PostgreSQL的過程,運行一個syncdb並且全部設置。

問題是我似乎無法讓我的應用程序連接到數據庫。我可以通過我下載的命令行或桌面應用程序登錄到PostgreSQL。只是不在腳本中。我可以使用manage.py shell訪問數據庫就好了。

有什麼想法?

回答

187

我看了一下例外,注意到它必須處理我的連接設置。回到settings.py,並看到我沒有主機設置。添加localhost和瞧。

我的settings.py沒有MySQL數據庫的HOST,但我需要添加一個PostgreSQL才能工作。

在我的情況下,我添加了localhostHOST設置,它工作。

以下是我的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 
    } 
} 
+5

你可以考慮從你的問題的解決移動到你的答案(並接受它)。這樣,這個問題仍然是一個問題,它會適當地提供答案。順便說一句:做得好! :-) –

+0

會做。謝謝。 –

+0

在Rails 3中遇到同樣的問題,你的建議解決了這個問題。乾杯! – Marco

6

我解決了這個問題通過編輯/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 
13

比完全信任更好的是把它設置爲md5。

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

+1;但注意md5通常(略)比密碼更好,因爲它會發送散列而不是密碼。 (當本地時,它並不重要,但如果通過可能的竊聽者在網絡上執行,這是非常重要的。) –

+0

如果PostgreSQL沒有密碼哈希值 - 我不知道它是否存在 - 那麼任何人足以真正竊聽你的連接,可能會通過彩虹表運行你的散列,無論如何打破你的安全。 –

+0

「md5」比「信任」更好,但最好是使用「peer」並創建一個沒有登錄權限的Linux用戶,僅用於本地連接。這樣你必須提供你的root密碼才能從本地訪問數據庫。 –

18

這可能是因爲你的腳本是根據比你試圖用(爲myuser這裏)連接一個其他一些用戶運行。在這種情況下,對等身份驗證將失敗。您的解決方案HOST: "localhost"適用,因爲您不再使用同行授權。但是,它比HOST: ""慢,因爲不使用unix套接字,而是使用TCP連接。從django docs

如果你使用PostgreSQL,默認情況下(空HOST),以 連接的數據庫是通過UNIX域套接字(在 pg_hba.conf的「本地」行)來完成。如果要通過TCP套接字進行連接,請將HOST設置爲 'localhost'或'127.0.0.1'(pg_hba.conf中的「主機」行)。在Windows上, 您應該始終定義HOST,因爲UNIX域套接字不是 可用。

如果你想繼續使用套接字,需要在pg_hba.conf的正確設置。最簡單的是:

local all   all        trust 

同時註釋掉配置中的所有其他local行。請注意,需要重新加載postgres才能使此更改生效。

但是,如果多用戶生產機器出現問題,您可能想要使用更安全的產品,如md5(有關各種認證方法的說明,請參閱here)。

+1

這應該是anwer ...(更多文檔,更多解釋) – ThePhi

3

我只是偶然發現了同樣的問題,但希望使用unix套接字作爲clime說,但仍然使用peer方法。我使用pg_hba.conf中的postgres-username映射了我的系統用戶名,該用戶名與peer方法一起使用。

pg_hba.conf我說:裏面pg_ident.conf我加入

local all all peer map=map-name 

map-name mysystem-username mypostgres-username