Koneksi Django ke PostgreSQL: “Otentikasi sesama gagal”

121
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

Ini adalah kesalahan yang saya terima ketika saya mencoba masuk ke situs admin Django saya. Saya telah menggunakan database MySQL tidak ada masalah. Saya baru mengenal PostgreSQL, tetapi memutuskan untuk beralih karena host yang akhirnya saya rencanakan untuk digunakan untuk proyek ini tidak memiliki MySQL.

Oleh karena itu, saya pikir saya bisa melalui proses menginstal PostgreSQL, menjalankan syncdbdan siap.

Masalahnya adalah saya tidak bisa membuat aplikasi saya terhubung ke database. Saya dapat masuk ke PostgreSQL melalui baris perintah atau aplikasi desktop yang saya unduh. Tidak hanya di skrip.

Juga, saya dapat menggunakan manage.py shelluntuk mengakses db dengan baik.

Ada pemikiran?

Brewmaster
sumber

Jawaban:

219

Saya mengintip pengecualian, memperhatikan itu ada hubungannya dengan pengaturan koneksi saya. Kembali ke settings.py , dan melihat saya tidak memiliki penyiapan Host. Tambahkan localhostdan voila.

Settings.py saya tidak memiliki HOST untuk database MySQL, tetapi saya perlu menambahkan satu agar PostgreSQL berfungsi.

Dalam kasus saya, saya menambahkan localhostke HOSTpengaturan dan berhasil.

Ini adalah DATABASESbagian dari saya 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
    } 
}
Brewmaster
sumber
5
Anda dapat mempertimbangkan untuk memindahkan solusi dari pertanyaan Anda ke jawaban Anda (dan menerimanya). Dengan cara ini, pertanyaan akan tetap menjadi pertanyaan dan akan memberikan jawaban dengan benar. BTW: kerja bagus! :-)
Piotr Nowicki
3
Memiliki masalah yang sama dengan aplikasi Rails, dan itu adalah solusi yang sama - host perlu dikonfigurasi config/database.yml- artinya, dalam file itu saya perlu menambahkan baris host: localhost(atau di mana pun Anda server postgres - milik saya lokal)
jefflunt
7
Ketika HOST kosong, Django mencoba menghubungkan ke database menggunakan soket UNIX. Di sisi lain, ketika HOST adalah "localhost", ia terhubung melalui TCP / IP ke 127.0.0.1. Kemungkinan, Anda pg_hba.confdiatur untuk menolak pengguna biasa terhubung melalui soket UNIX tetapi mengizinkan mereka melalui TCP / IP dari localhost.
Jim Garrison
3
Dokumentasi ( docs.djangoproject.com/en/1.6/ref/settings/#host ) terletak: "HOST [...] String kosong berarti localhost". Ini tidak benar, saya memiliki masalah yang sama dan saya memperbaikinya dengan menulis 'localhost'. Terima kasih atas tipnya.
Marco Sulla
1
Ah HA! Saya tahu saya TAHU kata sandinya. Mezanin menghasilkan local_settings.pyfile dan # Set to empty string for localhost. Not used with sqlite3.ada di file . KEBOHONGAN!!!
teewuane
24

Itu mungkin karena skrip Anda berjalan di bawah beberapa pengguna selain yang Anda coba sambungkan ( myuser di sini). Dalam kasus ini, otentikasi rekan akan gagal. Solusi Anda dengan HOST: "localhost"berfungsi karena Anda tidak menggunakan autentikasi rekan lagi. Namun, ini lebih lambat daripada HOST: ""menggunakan soket unix, Anda menggunakan koneksi TCP. Dari dokumen django :

Jika Anda menggunakan PostgreSQL, secara default (HOST kosong), koneksi ke database dilakukan melalui soket domain UNIX (baris 'lokal' di pg_hba.conf). Jika Anda ingin terhubung melalui soket TCP, setel HOST ke 'localhost' atau '127.0.0.1' (baris 'host' di pg_hba.conf). Di Windows, Anda harus selalu menentukan HOST, karena soket domain UNIX tidak tersedia.

Jika Anda ingin tetap menggunakan soket, pg_hba.confdiperlukan pengaturan yang benar . Yang paling sederhana adalah:

local   all         all                               trust

sambil mengomentari semua localbaris lain di konfigurasi. Perhatikan bahwa memuat ulang postgres diperlukan agar perubahan ini diterapkan.

Tetapi jika mesin produksi multi-pengguna dipertanyakan, Anda mungkin ingin menggunakan sesuatu yang lebih aman seperti md5(lihat di sini untuk penjelasan tentang berbagai metode otentikasi).

iklim
sumber
15

Lebih baik daripada percaya sepenuhnya hanya dengan mengaturnya ke md5.

# "local" is for Unix domain socket connections only
local   all         all                           md5
Houman
sumber
6
+1; tetapi catatan md5 secara umum (sedikit) lebih baik daripada kata sandi karena akan mengirimkan hash daripada kata sandi. (Ketika lokal itu tidak terlalu penting; tetapi jika melakukannya melalui jaringan dengan kemungkinan penyadap itu signifikan.)
dr jimbob
Jika PostgreSQL tidak mengasinkan hash kata sandi - dan saya tidak tahu apakah demikian atau tidak - maka siapa pun yang cukup canggih untuk benar-benar menguping koneksi Anda mungkin akan menjalankan hash Anda melalui tabel pelangi dan merusak keamanan Anda.
Lyndsy Simon
1
"md5" lebih baik daripada "trust", tetapi yang terbaik adalah menggunakan "peer" dan membuat pengguna Linux tanpa izin login, hanya untuk koneksi lokal. Dengan cara ini Anda harus memberikan kata sandi root Anda untuk mengakses db dari lokal.
Marco Sulla
6

Saya memperbaikinya dengan mengedit bagian bawah /etc/postgres/9.1/main/pg_hba.conf menjadi (mengubah md5 menjadi percaya; CATATAN ini berarti tidak akan ada kata sandi database, yang mungkin bukan yang Anda inginkan)

# 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
vish
sumber
5

Saya baru saja menemukan masalah yang sama tetapi ingin menggunakan soket unix seperti yang dikatakan clime, tetapi dengan tetap menggunakan peermetode tersebut. Saya memetakan nama pengguna sistem saya dengan nama pengguna postgres di dalam pg_hba.conf, yang berfungsi dengan peermetode ini.

Di dalam pg_hba.confsaya menambahkan:

local all all peer map=map-name

Di dalam pg_ident.confsaya menambahkan:

map-name mysystem-username mypostgres-username
terlihat
sumber