PostgreSQL'e Django bağlantısı: "Eş kimlik doğrulaması başarısız oldu"


122
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Bu, Django yönetici siteme ulaşmaya çalıştığımda aldığım hatadır. MySQL veritabanını kullanıyordum sorun değil. PostgreSQL'de yeniyim, ancak nihayetinde bu proje için kullanmayı planladığım ana bilgisayarda MySQL olmadığı için geçiş yapmaya karar verdim.

Bu nedenle, PostgreSQL kurma sürecinden geçebileceğimi, a çalıştırabileceğimi syncdbve her şeyi ayarlayabileceğimi düşündüm .

Sorun şu ki, uygulamamın veritabanına bağlanmasını sağlayamıyorum. İndirdiğim komut satırı veya masaüstü uygulaması ile PostgreSQL'e giriş yapabiliyorum. Sadece senaryoda değil.

Ayrıca, manage.py shelldb'ye gayet iyi erişmek için kullanabilirim .

Düşüncesi olan var mı?

Yanıtlar:


220

İstisnaya bir göz attım, bağlantı ayarlarımla ilgisi olduğunu fark ettim. Settings.py'ye geri döndüm ve bir Ana bilgisayar kurulumum olmadığını gördüm. Ekle localhostve tamam.

Settings.py MySQL için bir HOST veritabanına sahip değildi, ancak PostgreSQL'in çalışması için bir tane eklemem gerekiyordu.

Benim durumumda, ben ekledi localhostiçin HOSTayar ve işe yaradı.

İşte DATABASESbenim bölümüm 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
çözümü sorunuzdan cevabınıza taşımayı (ve kabul etmeyi) düşünebilirsiniz. Bu şekilde, soru bir soru olarak kalacak ve doğru şekilde cevap vermiş olacaktır. BTW: iyi iş! :-)
Piotr Nowicki

3
Bir Rails uygulamasında aynı sorunu config/database.ymlyaşadım ve bu aynı çözümdü - ana bilgisayarın yapılandırılması gerekiyordu - yani, o dosyaya satırı eklemem gerekiyordu host: localhost(veya postgres sunucunuz nerede olursanız olun, benimki yereldi)
jefflunt

7
HOST boş olduğunda, Django veritabanına UNIX soketlerini kullanarak bağlanmaya çalışır. Öte yandan, HOST "localhost" olduğunda, TCP / IP üzerinden 127.0.0.1'e bağlanır. Muhtemelen, sizin pg_hba.confsıradan kullanıcıların UNIX soketleri üzerinden bağlanmalarına izin vermeyecek, ancak onlara localhost'tan TCP / IP üzerinden izin verecek şekilde ayarlanmıştır.
Jim Garrison

3
Belgeler ( docs.djangoproject.com/en/1.6/ref/settings/#host ) yalanlar: "HOST [...] Boş bir dize, localhost anlamına gelir". Bu doğru değil, aynı sorunu yaşadım ve 'localhost' yazarak düzelttim. Bahşiş için teşekkürler
Marco Sulla

1
Ah HA! Şifreyi bildiğimi biliyordum. Mezzanine bir local_settings.pydosya oluşturur ve # Set to empty string for localhost. Not used with sqlite3.. YALANLAR!!!
teewuane

24

Senin script (bağlanmaya çalıştığınız olandan başka bir kullanıcı altında çalıştığı sebebi muhtemelen MyUser burada). Bu durumda, eş kimlik doğrulaması başarısız olur. Çözümünüz HOST: "localhost"işe yarıyor çünkü artık eş kimlik doğrulaması kullanmıyorsunuz. Ancak, HOST: ""unix soketleri kullanmak yerine TCP bağlantılarını kullandığınızdan daha yavaştır . Gönderen Django dokümanlar :

PostgreSQL kullanıyorsanız, varsayılan olarak (boş HOST), veritabanına bağlantı UNIX etki alanı soketleri (pg_hba.conf içindeki 'yerel' satırlar) aracılığıyla yapılır. TCP soketleri üzerinden bağlanmak istiyorsanız, HOST'u 'localhost' veya '127.0.0.1' (pg_hba.conf'daki 'host' satırları) olarak ayarlayın. Windows'ta, UNIX etki alanı soketleri mevcut olmadığından, her zaman HOST'u tanımlamalısınız.

Soketleri kullanmaya devam etmek istiyorsanız, doğru ayarlar pg_hba.confgereklidir. En basit olanı:

local   all         all                               trust

localyapılandırmadaki diğer tüm satırları yorumlarken . Bu değişikliğin geçerli olması için postgres yüklemesinin gerekli olduğunu unutmayın.

Ancak çok kullanıcılı üretim makinesi söz konusuysa, daha güvenli bir şey kullanmak isteyebilirsiniz (çeşitli kimlik doğrulama yöntemlerinin açıklamaları için burayamd5 bakın ).


15

Tamamen güvenden daha iyi, sadece md5 olarak ayarlamaktır.

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

6
+ 1; ancak, md5'in genel olarak (biraz) paroladan daha iyi olduğunu unutmayın, çünkü bir parola yerine bir karma gönderecektir. (Yerel olduğunda çok da önemli değil; ancak bunu olası kulak misafiri olan ağ üzerinden yapıyorsanız önemli.)
dr jimbob

PostgreSQL parola karmalarını tuzlamazsa - ve öyle olup olmadığını bilmiyorum - o zaman bağlantınızı gerçekten gizlice dinleyebilecek kadar sofistike biri muhtemelen karmanızı bir gökkuşağı tablosundan geçirecek ve güvenliğinizi bir şekilde kıracaktır.
Lyndsy Simon

1
"md5" "güven" den daha iyidir, ancak en iyisi "eş" kullanmak ve yalnızca yerel bağlantılar için oturum açma izni olmayan bir Linux kullanıcısı oluşturmaktır. Bu şekilde db'ye yerelden erişmek için kök parolanızı sağlamanız gerekir.
Marco Sulla

6

Bunu, /etc/postgres/9.1/main/pg_hba.conf'un altını olacak şekilde düzenleyerek düzelttim (md5'i güvenecek şekilde değiştirerek; NOT bu, veritabanı şifresi olmayacağı anlamına gelir, ki bu istediğiniz şey olmayabilir)

# 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

Ben de aynı problemle karşılaştım ama clime'ın dediği gibi unix soketlerini kullanmak istedim, ama yine de peeryöntemi kullanarak . Sistem kullanıcı adımı pg_hba.conf, peeryöntemle çalışan içindeki postgres-kullanıcı adı ile eşledim .

İçine pg_hba.confekledim:

local all all peer map=map-name

İçine pg_ident.confekledim:

map-name mysystem-username mypostgres-username
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.