PostgreSQL के लिए Django कनेक्शन: "सहकर्मी प्रमाणीकरण विफल"


120
OperationalError at /admin/

FATAL:  Peer authentication failed for user "myuser"

यह वह त्रुटि है जो मुझे तब मिल रही है जब मैं अपने Django व्यवस्थापक साइट पर पहुंचने का प्रयास करता हूं। मैं MySQL डेटाबेस का उपयोग कर रहा था कोई समस्या नहीं है। मैं PostgreSQL के लिए नया हूं, लेकिन स्विच करने का निर्णय लिया है क्योंकि इस परियोजना के लिए मैं जिस होस्ट का उपयोग करने की योजना बनाता हूं, उसमें MySQL नहीं है।

इसलिए, मुझे लगा कि मैं PostgreSQL को स्थापित करने की प्रक्रिया से गुजर सकता हूं, एक चलाऊंगा syncdbऔर सब सेट करूंगा ।

समस्या यह है कि मैं डेटाबेस से जुड़ने के लिए अपना ऐप प्राप्त नहीं कर सकता। मैं PostgreSQL को कमांड लाइन या डेस्कटॉप ऐप के माध्यम से लॉगिन कर सकता हूं जिसे मैंने डाउनलोड किया था। सिर्फ स्क्रिप्ट में नहीं।

इसके अलावा, मैं manage.py shelldb तक पहुँचने के लिए उपयोग कर सकता हूँ बस ठीक है।

कोई विचार?

जवाबों:


218

मैंने अपवाद पर एक नज़र डाली, ध्यान दिया कि इसे मेरी कनेक्शन सेटिंग्स के साथ करना था। सेटिंग्स में वापस चले गए, और मैंने देखा कि मेरे पास होस्ट सेटअप नहीं है। जोड़ें localhostऔर वॉइला।

मेरी सेटिंग्स थिंकपैड में MySQL डेटाबेस के लिए HOST नहीं था, लेकिन मुझे काम करने के लिए PostgreSQL में एक जोड़ने की आवश्यकता थी।

मेरे मामले में, मैं जोड़ा localhostको HOSTस्थापित करने और यह काम किया।

यहाँ 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: अच्छा काम! :-)
पायोटर नोविकी

3
रेल एप्लिकेशन के साथ भी यही समस्या थी, और यह एक ही समाधान था - मेजबान को कॉन्फ़िगर करने की आवश्यकता थी config/database.yml- यह कहना है, उस फ़ाइल में मुझे लाइन जोड़ने की आवश्यकता है host: localhost(या जहां भी आप सर्वर को पोस्ट करते हैं - मेरा स्थानीय था)
जेफ्लंट

7
जब HOST रिक्त होता है, तो Django UNIX सॉकेट्स का उपयोग करके डेटाबेस से जुड़ने का प्रयास करता है। दूसरी ओर, जब HOST "लोकलहोस्ट" होता है, तो यह टीसीपी / आईपी से 127.0.0.1 तक जुड़ जाता है। pg_hba.confआमतौर पर , आपका उपयोगकर्ता UNIX सॉकेट्स के माध्यम से कनेक्ट करने से आम उपयोगकर्ताओं को इनकार करने के लिए सेट किया गया है, लेकिन स्थानीय होस्ट से टीसीपी / आईपी पर उन्हें अनुमति देता है।
जिम गैरिसन

3
दस्तावेज़ीकरण ( docs.djangoproject.com/en/1.6/ref/settings/#host ) झूठ: "HOST [...] एक खाली स्ट्रिंग का अर्थ है लोकलहोस्ट"। यह सच नहीं है, मुझे भी यही समस्या थी और मैंने इसे 'लोकलहोस्ट' लिखने का फैसला किया। टिप के लिए धन्यवाद।
मार्को सुल्ला

1
आह हा! मुझे पता था कि मैंने पासवर्ड को KNEW किया है। मेजेनाइन एक local_settings.pyफ़ाइल का उत्पादन करता है और # Set to empty string for localhost. Not used with sqlite3.उनमें है। झूठ !!!
तेवुआं

23

ऐसा शायद इसलिए है क्योंकि आपकी स्क्रिप्ट किसी अन्य उपयोगकर्ता के तहत चल रही है, जिसे आप ( यहां माईसर ) के साथ जोड़ने की कोशिश कर रहे हैं । इस स्थिति में, सहकर्मी प्रमाणीकरण विफल हो जाएगा। HOST: "localhost"काम के साथ आपका समाधान क्योंकि आप अब सहकर्मी का उपयोग नहीं कर रहे हैं। हालाँकि, यह धीमा है HOST: ""क्योंकि यूनिक्स सॉकेट्स का उपयोग करने के बजाय, आप टीसीपी कनेक्शन का उपयोग करते हैं। से Django डॉक्स :

यदि आप डिफ़ॉल्ट रूप से (खाली HOST) PostgreSQL का उपयोग कर रहे हैं, तो डेटाबेस से कनेक्शन UNIX डोमेन सॉकेट (pg_hba.conf में 'स्थानीय' लाइनों) के माध्यम से किया जाता है। यदि आप टीसीपी सॉकेट्स के माध्यम से कनेक्ट करना चाहते हैं, तो HOST को 'लोकलहोस्ट' या '127.0.0.1' ('होस्ट' लाइनों को pg_hba.conf में सेट करें)। विंडोज पर, आपको हमेशा HOST को परिभाषित करना चाहिए, क्योंकि UNIX डोमेन सॉकेट उपलब्ध नहीं हैं।

यदि आप सॉकेट्स का उपयोग करते रहना चाहते हैं, तो सही सेटिंग्स की pg_hba.confआवश्यकता है। सबसे सरल है:

local   all         all                               trust

localकॉन्फ़िगरेशन में अन्य सभी पंक्तियों को टिप्पणी करते समय । ध्यान दें कि इस परिवर्तन को प्रभावी होने के लिए पुनः लोडिंग पोस्टग्रेज की आवश्यकता होती है।

लेकिन यदि बहु-उपयोगकर्ता उत्पादन मशीन प्रश्न में है, तो आप कुछ अधिक सुरक्षित उपयोग करना चाहते हैं जैसे md5( विभिन्न प्रमाणीकरण विधियों के स्पष्टीकरण के लिए यहां देखें )।


14

पूरी तरह से विश्वास से बेहतर सिर्फ इसे md5 पर सेट करना है।

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

5
+1; लेकिन नोट md5 सामान्य रूप से (थोड़ा) पासवर्ड से बेहतर है क्योंकि यह पासवर्ड के विपरीत हैश भेजेगा। (जब स्थानीय यह ज्यादा मायने नहीं रखता है; लेकिन अगर यह संभव है कि यह महत्वपूर्ण है के साथ नेटवर्क पर कर रहा है।)
डॉ। Jimbob

यदि PostgreSQL नमक पासवर्ड हैश नहीं करता है - और मुझे नहीं पता कि यह करता है या नहीं - तो आपके कनेक्शन पर वास्तव में उत्सुकता से परिष्कृत कोई भी संभवतः इंद्रधनुष तालिका के माध्यम से आपके हैश को चलाने जा रहा है और किसी भी तरह आपकी सुरक्षा को तोड़ देगा।
लिंडसी साइमन

"md5" "विश्वास" से बेहतर है, लेकिन सबसे अच्छा "पीयर" का उपयोग करना और केवल स्थानीय कनेक्शन के लिए, लॉगिन अनुमतियों के बिना लिनक्स उपयोगकर्ता बनाना है। इस तरह से आपको db को स्थानीय से एक्सेस करने के लिए अपना रूट पासवर्ड प्रदान करना होगा।
मार्को सुल्ला

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

5

मैं सिर्फ एक ही समस्या पर ठोकर खाई, लेकिन यूनिक्स सॉकेट्स का उपयोग करना चाहता था, जैसा कि क्लिम ने कहा था, लेकिन अभी भी peerविधि का उपयोग करके । मैंने अपने सिस्टम-यूज़रनेम को पोस्टग्रेज-यूज़रनेम के साथ मैप किया pg_hba.conf, जो कि peerविधि के साथ काम कर रहा है ।

अंदर pg_hba.confमैंने जोड़ा:

local all all peer map=map-name

अंदर pg_ident.confमैंने जोड़ा:

map-name mysystem-username mypostgres-username
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.